diff options
| author | 2017-02-07 13:02:37 +0100 | |
|---|---|---|
| committer | 2017-02-07 13:02:37 +0100 | |
| commit | 8368f3d66e963af2040a7cc750a041226364926f (patch) | |
| tree | 842fdbb765b264bc68e3ce151c452ec4986f2b96 /src/bplist.c | |
| parent | 07e92dd116ed08ec8fc12cae6e48d7f2146aec53 (diff) | |
| download | libplist-8368f3d66e963af2040a7cc750a041226364926f.tar.gz libplist-8368f3d66e963af2040a7cc750a041226364926f.tar.bz2 | |
bplist: Properly handle some more malloc() failure situations
Diffstat (limited to 'src/bplist.c')
| -rw-r--r-- | src/bplist.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/bplist.c b/src/bplist.c index 640a5c0..bf8d985 100644 --- a/src/bplist.c +++ b/src/bplist.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <stdlib.h> | 27 | #include <stdlib.h> |
| 28 | #include <stdio.h> | 28 | #include <stdio.h> |
| 29 | #include <string.h> | 29 | #include <string.h> |
| 30 | #include <assert.h> | ||
| 30 | 31 | ||
| 31 | #include <ctype.h> | 32 | #include <ctype.h> |
| 32 | #include <inttypes.h> | 33 | #include <inttypes.h> |
| @@ -304,13 +305,19 @@ static plist_t parse_string_node(const char **bnode, uint64_t size) | |||
| 304 | static char *plist_utf16_to_utf8(uint16_t *unistr, long len, long *items_read, long *items_written) | 305 | static char *plist_utf16_to_utf8(uint16_t *unistr, long len, long *items_read, long *items_written) |
| 305 | { | 306 | { |
| 306 | if (!unistr || (len <= 0)) return NULL; | 307 | if (!unistr || (len <= 0)) return NULL; |
| 307 | char *outbuf = (char*)malloc(4*(len+1)); | 308 | char *outbuf; |
| 308 | int p = 0; | 309 | int p = 0; |
| 309 | long i = 0; | 310 | long i = 0; |
| 310 | 311 | ||
| 311 | uint16_t wc; | 312 | uint16_t wc; |
| 312 | uint32_t w; | 313 | uint32_t w; |
| 313 | int read_lead_surrogate = 0; | 314 | int read_lead_surrogate = 0; |
| 315 | |||
| 316 | outbuf = (char*)malloc(4*(len+1)); | ||
| 317 | if (!outbuf) { | ||
| 318 | PLIST_BIN_ERR("%s: Could not allocate %" PRIu64 " bytes\n", __func__, (uint64_t)(4*(len+1))); | ||
| 319 | return NULL; | ||
| 320 | } | ||
| 314 | 321 | ||
| 315 | while (i < len) { | 322 | while (i < len) { |
| 316 | wc = unistr[i++]; | 323 | wc = unistr[i++]; |
| @@ -906,6 +913,7 @@ static void serialize_plist(node_t* node, void* data) | |||
| 906 | } | 913 | } |
| 907 | //insert new ref | 914 | //insert new ref |
| 908 | index_val = (uint64_t *) malloc(sizeof(uint64_t)); | 915 | index_val = (uint64_t *) malloc(sizeof(uint64_t)); |
| 916 | assert(index_val != NULL); | ||
| 909 | *index_val = current_index; | 917 | *index_val = current_index; |
| 910 | hash_table_insert(ser->ref_table, node, index_val); | 918 | hash_table_insert(ser->ref_table, node, index_val); |
| 911 | 919 | ||
| @@ -1079,7 +1087,7 @@ static int is_ascii_string(char* s, int len) | |||
| 1079 | 1087 | ||
| 1080 | static uint16_t *plist_utf8_to_utf16(char *unistr, long size, long *items_read, long *items_written) | 1088 | static uint16_t *plist_utf8_to_utf16(char *unistr, long size, long *items_read, long *items_written) |
| 1081 | { | 1089 | { |
| 1082 | uint16_t *outbuf = (uint16_t*)malloc(((size*2)+1)*sizeof(uint16_t)); | 1090 | uint16_t *outbuf; |
| 1083 | int p = 0; | 1091 | int p = 0; |
| 1084 | long i = 0; | 1092 | long i = 0; |
| 1085 | 1093 | ||
| @@ -1090,6 +1098,12 @@ static uint16_t *plist_utf8_to_utf16(char *unistr, long size, long *items_read, | |||
| 1090 | 1098 | ||
| 1091 | uint32_t w; | 1099 | uint32_t w; |
| 1092 | 1100 | ||
| 1101 | outbuf = (uint16_t*)malloc(((size*2)+1)*sizeof(uint16_t)); | ||
| 1102 | if (!outbuf) { | ||
| 1103 | PLIST_BIN_ERR("%s: Could not allocate %" PRIu64 " bytes\n", __func__, (uint64_t)((size*2)+1)*sizeof(uint16_t)); | ||
| 1104 | return NULL; | ||
| 1105 | } | ||
| 1106 | |||
| 1093 | while (i < size) { | 1107 | while (i < size) { |
| 1094 | c0 = unistr[i]; | 1108 | c0 = unistr[i]; |
| 1095 | c1 = (i < size-1) ? unistr[i+1] : 0; | 1109 | c1 = (i < size-1) ? unistr[i+1] : 0; |
| @@ -1185,6 +1199,7 @@ PLIST_API void plist_to_bin(plist_t plist, char **plist_bin, uint32_t * length) | |||
| 1185 | 1199 | ||
| 1186 | //write objects and table | 1200 | //write objects and table |
| 1187 | offsets = (uint64_t *) malloc(num_objects * sizeof(uint64_t)); | 1201 | offsets = (uint64_t *) malloc(num_objects * sizeof(uint64_t)); |
| 1202 | assert(offsets != NULL); | ||
| 1188 | for (i = 0; i < num_objects; i++) | 1203 | for (i = 0; i < num_objects; i++) |
| 1189 | { | 1204 | { |
| 1190 | 1205 | ||
