summaryrefslogtreecommitdiffstats
path: root/src/bplist.c
diff options
context:
space:
mode:
authorGravatar Filippo Bigarella2016-11-10 01:34:02 +0100
committerGravatar Nikias Bassen2016-11-10 01:34:02 +0100
commit23fe533a0f0f34e9cb1d2e328107958645d54ed1 (patch)
tree5c04c5313f57d5dddf8b5a9ca8ef0d1a29aa2ec6 /src/bplist.c
parenta4ca24c4fe316bc102b9fa52f808d206ab8cd24b (diff)
downloadlibplist-23fe533a0f0f34e9cb1d2e328107958645d54ed1.tar.gz
libplist-23fe533a0f0f34e9cb1d2e328107958645d54ed1.tar.bz2
bplist: Make sure to error out if allocation of `used_indexes` buffer in plist_from_bin() fails
If the allocation fails, a lot of bad things can happen so we check the result and return accordingly. We also check that the multiplication used to calculate the buffer size doesn't overflow. Otherwise this could lead to an allocation of a very small buffer compared to what we need, ultimately leading to arbitrary writes later on.
Diffstat (limited to 'src/bplist.c')
-rw-r--r--src/bplist.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/bplist.c b/src/bplist.c
index be82b4e..49d29c5 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -742,6 +742,9 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
742 if (offset_table + num_objects * offset_size >= plist_bin + length) 742 if (offset_table + num_objects * offset_size >= plist_bin + length)
743 return; 743 return;
744 744
745 if (sizeof(uint32_t) * num_objects < num_objects)
746 return;
747
745 struct bplist_data bplist; 748 struct bplist_data bplist;
746 bplist.data = plist_bin; 749 bplist.data = plist_bin;
747 bplist.size = length; 750 bplist.size = length;
@@ -752,6 +755,9 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
752 bplist.level = 0; 755 bplist.level = 0;
753 bplist.used_indexes = (uint32_t*)malloc(sizeof(uint32_t) * num_objects); 756 bplist.used_indexes = (uint32_t*)malloc(sizeof(uint32_t) * num_objects);
754 757
758 if (!bplist.used_indexes)
759 return;
760
755 *plist = parse_bin_node_at_index(&bplist, root_object); 761 *plist = parse_bin_node_at_index(&bplist, root_object);
756 762
757 free(bplist.used_indexes); 763 free(bplist.used_indexes);