summaryrefslogtreecommitdiff
path: root/src/core/text.c
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2018-07-29 10:02:56 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2018-07-29 10:03:00 +0100
commit77c5d9f20a3e51b64a065e14449333b7a1e9f00d (patch)
tree6be51b635e381a2af6115d126e5d4d91e3b557f6 /src/core/text.c
parentc3673402999c587dde0292aea9f1de06600a59e1 (diff)
downloadlibdom-77c5d9f20a3e51b64a065e14449333b7a1e9f00d.tar.gz
libdom-77c5d9f20a3e51b64a065e14449333b7a1e9f00d.tar.bz2
Correct COLLECT logic in walk_logic_adjacent_text_in_order to stop leak
Diffstat (limited to 'src/core/text.c')
-rw-r--r--src/core/text.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/core/text.c b/src/core/text.c
index 3b726fd..b73e86d 100644
--- a/src/core/text.c
+++ b/src/core/text.c
@@ -381,21 +381,32 @@ dom_exception walk_logic_adjacent_text_in_order(
assert(node->last_child == NULL);
if (opt == COLLECT) {
err = dom_characterdata_get_data(node, &data);
- if (err == DOM_NO_ERR)
+ if (err != DOM_NO_ERR)
return err;
tmp = *ret;
if (order == LEFT) {
- err = dom_string_concat(data, tmp, ret);
- if (err == DOM_NO_ERR)
- return err;
+ if (tmp != NULL) {
+ err = dom_string_concat(data, tmp, ret);
+ if (err != DOM_NO_ERR)
+ return err;
+ } else {
+ dom_string_ref(data);
+ *ret = data;
+ }
} else if (order == RIGHT) {
- err = dom_string_concat(tmp, data, ret);
- if (err == DOM_NO_ERR)
- return err;
+ if (tmp != NULL) {
+ err = dom_string_concat(tmp, data, ret);
+ if (err != DOM_NO_ERR)
+ return err;
+ } else {
+ dom_string_ref(data);
+ *ret = data;
+ }
}
- dom_string_unref(tmp);
+ if (tmp != NULL)
+ dom_string_unref(tmp);
dom_string_unref(data);
*cont = true;