diff options
| author | 2016-11-10 01:12:42 +0100 | |
|---|---|---|
| committer | 2016-11-10 01:12:42 +0100 | |
| commit | b86a392b819518cf37db78140d4ed4418c0177da (patch) | |
| tree | 6d717d81d6e7982b730f91ce0663f2525e52fa79 /src | |
| parent | a4563ffeaa0448712c739fc91526e8f210c1e164 (diff) | |
| download | libplist-b86a392b819518cf37db78140d4ed4418c0177da.tar.gz libplist-b86a392b819518cf37db78140d4ed4418c0177da.tar.bz2 | |
bplist: Fix possible out-of-bounds reads in parse_bin_node() with proper bounds checking
Diffstat (limited to 'src')
| -rw-r--r-- | src/bplist.c | 21 |
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; |
