bplist: Improve parsing unicode nodes
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 @@
   })
 
 
-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 @@
 
     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);
 }