diff options
-rw-r--r-- | src/bplist.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/src/bplist.c b/src/bplist.c index ad8e753..9e6e261 100644 --- a/src/bplist.c +++ b/src/bplist.c @@ -496,22 +496,14 @@ static plist_t parse_array_node(struct bplist_data *bplist, const char** bnode, static plist_t parse_uid_node(const char **bnode, uint8_t size) { plist_data_t data = plist_new_plist_data(); - - size = 1 << size; // make length less misleading - switch (size) - { - case sizeof(uint8_t): - case sizeof(uint16_t): - case sizeof(uint32_t): - case sizeof(uint64_t): - memcpy(&data->intval, *bnode, size); - data->intval = UINT_TO_HOST(&data->intval, size); - break; - default: + size = size + 1; + data->intval = UINT_TO_HOST(*bnode, size); + if (data->intval > UINT32_MAX) { free(data); return NULL; - }; + } + (*bnode) += size; data->type = PLIST_UID; data->length = sizeof(uint64_t); @@ -1034,6 +1026,7 @@ static void write_dict(bytearray_t * bplist, node_t* node, hashtable_t* ref_tabl static void write_uid(bytearray_t * bplist, uint64_t val) { + val = (uint32_t)val; uint64_t size = get_needed_bytes(val); uint8_t *buff = NULL; //do not write 3bytes int node @@ -1045,7 +1038,7 @@ static void write_uid(bytearray_t * bplist, uint64_t val) #endif buff = (uint8_t *) malloc(sizeof(uint8_t) + size); - buff[0] = BPLIST_UID | Log2(size); + buff[0] = BPLIST_UID | (size-1); // yes, this is what Apple does... memcpy(buff + 1, &val, size); byte_convert(buff + 1, size); byte_array_append(bplist, buff, sizeof(uint8_t) + size); |