summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bplist.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/bplist.c b/src/bplist.c
index 8447187..be82b4e 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -708,6 +708,7 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
708 uint64_t num_objects = 0; 708 uint64_t num_objects = 0;
709 uint64_t root_object = 0; 709 uint64_t root_object = 0;
710 uint64_t offset_table_index = 0; 710 uint64_t offset_table_index = 0;
711 char *offset_table = NULL;
711 712
712 //first check we have enough data 713 //first check we have enough data
713 if (!(length >= BPLIST_MAGIC_SIZE + BPLIST_VERSION_SIZE + BPLIST_TRL_SIZE)) 714 if (!(length >= BPLIST_MAGIC_SIZE + BPLIST_VERSION_SIZE + BPLIST_TRL_SIZE))
@@ -727,6 +728,7 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
727 num_objects = be64dec(trailer + BPLIST_TRL_NUMOBJ_IDX); 728 num_objects = be64dec(trailer + BPLIST_TRL_NUMOBJ_IDX);
728 root_object = be64dec(trailer + BPLIST_TRL_ROOTOBJ_IDX); 729 root_object = be64dec(trailer + BPLIST_TRL_ROOTOBJ_IDX);
729 offset_table_index = be64dec(trailer + BPLIST_TRL_OFFTAB_IDX); 730 offset_table_index = be64dec(trailer + BPLIST_TRL_OFFTAB_IDX);
731 offset_table = (char *) (plist_bin + offset_table_index);
730 732
731 if (num_objects == 0) 733 if (num_objects == 0)
732 return; 734 return;
@@ -734,13 +736,19 @@ PLIST_API void plist_from_bin(const char *plist_bin, uint32_t length, plist_t *
734 if (root_object >= num_objects) 736 if (root_object >= num_objects)
735 return; 737 return;
736 738
739 if (offset_table < plist_bin || offset_table >= plist_bin + length)
740 return;
741
742 if (offset_table + num_objects * offset_size >= plist_bin + length)
743 return;
744
737 struct bplist_data bplist; 745 struct bplist_data bplist;
738 bplist.data = plist_bin; 746 bplist.data = plist_bin;
739 bplist.size = length; 747 bplist.size = length;
740 bplist.num_objects = num_objects; 748 bplist.num_objects = num_objects;
741 bplist.dict_size = dict_size; 749 bplist.dict_size = dict_size;
742 bplist.offset_size = offset_size; 750 bplist.offset_size = offset_size;
743 bplist.offset_table = (char *) (plist_bin + offset_table_index); 751 bplist.offset_table = offset_table;
744 bplist.level = 0; 752 bplist.level = 0;
745 bplist.used_indexes = (uint32_t*)malloc(sizeof(uint32_t) * num_objects); 753 bplist.used_indexes = (uint32_t*)malloc(sizeof(uint32_t) * num_objects);
746 754