diff options
author | Nikias Bassen | 2017-01-28 05:10:51 +0100 |
---|---|---|
committer | Nikias Bassen | 2017-01-28 05:10:51 +0100 |
commit | 30e14a3ec62ddc37738b8afe2345413397410420 (patch) | |
tree | 5d60729bf472f6407ace716953c36dc2cd0fd391 /src/bplist.c | |
parent | 96ced4ea51df8d2816b5e0e97203be38949aa2b0 (diff) | |
download | libplist-30e14a3ec62ddc37738b8afe2345413397410420.tar.gz libplist-30e14a3ec62ddc37738b8afe2345413397410420.tar.bz2 |
bplist: Improve parsing unicode nodes
Diffstat (limited to 'src/bplist.c')
-rw-r--r-- | src/bplist.c | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/src/bplist.c b/src/bplist.c index 5a9d678..0c57a75 100644 --- a/src/bplist.c +++ b/src/bplist.c @@ -93,22 +93,6 @@ union plist_uint_ptr }) -static void byte_convert(uint8_t * address, size_t size) -{ -#ifdef __LITTLE_ENDIAN__ - uint8_t i = 0, j = 0; - uint8_t tmp = 0; - - for (i = 0; i < (size / 2); i++) - { - tmp = address[i]; - j = ((size - 1) + 0) - i; - address[i] = address[j]; - address[j] = tmp; - } -#endif -} - #ifndef bswap16 #define bswap16(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8)) #endif @@ -353,19 +337,22 @@ static plist_t parse_unicode_node(const char **bnode, uint64_t size) data->type = PLIST_STRING; unicodestr = (uint16_t*) malloc(sizeof(uint16_t) * size); - memcpy(unicodestr, *bnode, sizeof(uint16_t) * size); for (i = 0; i < size; i++) - byte_convert((uint8_t *) (unicodestr + i), sizeof(uint16_t)); + unicodestr[i] = be16toh(((uint16_t*)*bnode)[i]); tmpstr = plist_utf16_to_utf8(unicodestr, size, &items_read, &items_written); free(unicodestr); + if (!tmpstr) { + plist_free_data(data); + return NULL; + } + tmpstr[items_written] = '\0'; data->type = PLIST_STRING; - data->strval = (char *) malloc(sizeof(char) * (items_written + 1)); - memcpy(data->strval, tmpstr, items_written); - data->strval[items_written] = '\0'; - data->length = strlen(data->strval); - free(tmpstr); + data->strval = realloc(tmpstr, items_written+1); + if (!data->strval) + data->strval = tmpstr; + data->length = items_written; return node_create(NULL, data); } |