summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bplist.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/bplist.c b/src/bplist.c
index 8cafb6a..dad72a6 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -568,15 +568,21 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
568 } 568 }
569 569
570 case BPLIST_UINT: 570 case BPLIST_UINT:
571 if (*object - bplist->data + (uint64_t)(1 << size) >= bplist->size)
572 return NULL;
571 return parse_uint_node(object, size); 573 return parse_uint_node(object, size);
572 574
573 case BPLIST_REAL: 575 case BPLIST_REAL:
576 if (*object - bplist->data + (uint64_t)(1 << size) >= bplist->size)
577 return NULL;
574 return parse_real_node(object, size); 578 return parse_real_node(object, size);
575 579
576 case BPLIST_DATE: 580 case BPLIST_DATE:
577 if (3 != size) 581 if (3 != size)
578 return NULL; 582 return NULL;
579 else 583 else
584 if (*object - bplist->data + (uint64_t)(1 << size) >= bplist->size)
585 return NULL;
580 return parse_date_node(object, size); 586 return parse_date_node(object, size);
581 587
582 case BPLIST_DATA: 588 case BPLIST_DATA:
@@ -587,6 +593,9 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
587 plist_get_uint_val(size_node, &size); 593 plist_get_uint_val(size_node, &size);
588 plist_free(size_node); 594 plist_free(size_node);
589 } 595 }
596
597 if (*object - bplist->data + size >= bplist->size)
598 return NULL;
590 return parse_data_node(object, size); 599 return parse_data_node(object, size);
591 600
592 case BPLIST_STRING: 601 case BPLIST_STRING:
@@ -597,6 +606,9 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
597 plist_get_uint_val(size_node, &size); 606 plist_get_uint_val(size_node, &size);
598 plist_free(size_node); 607 plist_free(size_node);
599 } 608 }
609
610 if (*object - bplist->data + size >= bplist->size)
611 return NULL;
600 return parse_string_node(object, size); 612 return parse_string_node(object, size);
601 613
602 case BPLIST_UNICODE: 614 case BPLIST_UNICODE:
@@ -607,6 +619,9 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
607 plist_get_uint_val(size_node, &size); 619 plist_get_uint_val(size_node, &size);
608 plist_free(size_node); 620 plist_free(size_node);
609 } 621 }
622
623 if (*object - bplist->data + size * 2 >= bplist->size)
624 return NULL;
610 return parse_unicode_node(object, size); 625 return parse_unicode_node(object, size);
611 626
612 case BPLIST_SET: 627 case BPLIST_SET:
@@ -618,6 +633,9 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
618 plist_get_uint_val(size_node, &size); 633 plist_get_uint_val(size_node, &size);
619 plist_free(size_node); 634 plist_free(size_node);
620 } 635 }
636
637 if (*object - bplist->data + size >= bplist->size)
638 return NULL;
621 return parse_array_node(bplist, object, size); 639 return parse_array_node(bplist, object, size);
622 640
623 case BPLIST_UID: 641 case BPLIST_UID:
@@ -631,6 +649,9 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
631 plist_get_uint_val(size_node, &size); 649 plist_get_uint_val(size_node, &size);
632 plist_free(size_node); 650 plist_free(size_node);
633 } 651 }
652
653 if (*object - bplist->data + size >= bplist->size)
654 return NULL;
634 return parse_dict_node(bplist, object, size); 655 return parse_dict_node(bplist, object, size);
635 default: 656 default:
636 return NULL; 657 return NULL;