summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/xplist.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/xplist.c b/src/xplist.c
index 3971622..9569d07 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -955,7 +955,6 @@ static char* text_parts_get_content(text_part_t *tp, int unesc_entities, size_t
static int node_from_xml(parse_ctx ctx, plist_t *plist)
{
- int res;
char *tag = NULL;
char *keyname = NULL;
plist_t subnode = NULL;
@@ -1449,11 +1448,21 @@ err_out:
if (ctx->err) {
plist_free(*plist);
*plist = NULL;
- res = PLIST_ERR_PARSE;
- } else {
- res = PLIST_ERR_SUCCESS;
+ return PLIST_ERR_PARSE;
}
- return res;
+
+ /* check if we have a UID "dict" so we can replace it with a proper UID node */
+ if (PLIST_IS_DICT(*plist) && plist_dict_get_size(*plist) == 1) {
+ plist_t value = plist_dict_get_item(*plist, "CF$UID");
+ if (PLIST_IS_UINT(value)) {
+ uint64_t u64val = 0;
+ plist_get_uint_val(value, &u64val);
+ plist_free(*plist);
+ *plist = plist_new_uid(u64val);
+ }
+ }
+
+ return PLIST_ERR_SUCCESS;
}
PLIST_API plist_err_t plist_from_xml(const char *plist_xml, uint32_t length, plist_t * plist)