summaryrefslogtreecommitdiffstats
path: root/src/xplist.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2026-11-05 12:02:05 +0100
committerGravatar Nikias Bassen2026-11-05 12:02:05 +0100
commit9fd3406baec5997d386cdb4c7492117604ba0a70 (patch)
treec8a69bb4d08fb2fb1e20db5a8cd4e68d9affbe25 /src/xplist.c
parent4dc93bc274867b42aa82fc91ee4d5878d23a3f36 (diff)
downloadlibplist-9fd3406baec5997d386cdb4c7492117604ba0a70.tar.gz
libplist-9fd3406baec5997d386cdb4c7492117604ba0a70.tar.bz2
Fix leaks and crashes on allocation failure
Found by failing each allocation in turn under ASan/UBSan/LSan: - plist_free() leaked the whole tree if its work stack could not be allocated; free the children iteratively without extra memory - plist_copy(): when a shallow copy of a dict/array failed, the original's lookup table was freed along with the copy's data (use-after-free) - bplist parser: fix a NULL dereference in parse_date_node(), check the node_attach() results, and don't leak on failure; plist_to_bin() no longer leaks on an allocation failure - free the plist data when node creation fails (plist constructors, XML, JSON and binary parsers)
Diffstat (limited to 'src/xplist.c')
-rw-r--r--src/xplist.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/xplist.c b/src/xplist.c
index 19d98ed..adf3f40 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -1212,6 +1212,7 @@ static plist_err_t node_from_xml(parse_ctx ctx, plist_t *plist)
}
subnode = plist_new_node(data);
if (!subnode) {
+ plist_free_data(data);
PLIST_XML_ERR("failed to create node\n");
ctx->err = PLIST_ERR_NO_MEM;
goto err_out;