diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2018-07-29 10:02:56 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2018-07-29 10:03:00 +0100 |
commit | 77c5d9f20a3e51b64a065e14449333b7a1e9f00d (patch) | |
tree | 6be51b635e381a2af6115d126e5d4d91e3b557f6 /src/core/text.c | |
parent | c3673402999c587dde0292aea9f1de06600a59e1 (diff) | |
download | libdom-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.c | 27 |
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; |