diff options
Diffstat (limited to 'src/bplist.c')
| -rw-r--r-- | src/bplist.c | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/src/bplist.c b/src/bplist.c index 64c9081..2e32f70 100644 --- a/src/bplist.c +++ b/src/bplist.c | |||
| @@ -557,11 +557,12 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object) | |||
| 557 | 557 | ||
| 558 | case BPLIST_DATA: | 558 | case BPLIST_DATA: |
| 559 | if (BPLIST_FILL == size) { | 559 | if (BPLIST_FILL == size) { |
| 560 | plist_t size_node = parse_bin_node(bplist, object); | 560 | uint8_t next_size = **object & BPLIST_FILL; |
| 561 | if (plist_get_node_type(size_node) != PLIST_UINT) | 561 | if ((**object & BPLIST_MASK) != BPLIST_UINT) |
| 562 | return NULL; | 562 | return NULL; |
| 563 | plist_get_uint_val(size_node, &size); | 563 | (*object)++; |
| 564 | plist_free(size_node); | 564 | size = UINT_TO_HOST(*object, (1 << next_size)); |
| 565 | (*object) += (1 << next_size); | ||
| 565 | } | 566 | } |
| 566 | 567 | ||
| 567 | if (*object - bplist->data + size >= bplist->size) | 568 | if (*object - bplist->data + size >= bplist->size) |
| @@ -570,11 +571,12 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object) | |||
| 570 | 571 | ||
| 571 | case BPLIST_STRING: | 572 | case BPLIST_STRING: |
| 572 | if (BPLIST_FILL == size) { | 573 | if (BPLIST_FILL == size) { |
| 573 | plist_t size_node = parse_bin_node(bplist, object); | 574 | uint8_t next_size = **object & BPLIST_FILL; |
| 574 | if (plist_get_node_type(size_node) != PLIST_UINT) | 575 | if ((**object & BPLIST_MASK) != BPLIST_UINT) |
| 575 | return NULL; | 576 | return NULL; |
| 576 | plist_get_uint_val(size_node, &size); | 577 | (*object)++; |
| 577 | plist_free(size_node); | 578 | size = UINT_TO_HOST(*object, (1 << next_size)); |
| 579 | (*object) += (1 << next_size); | ||
| 578 | } | 580 | } |
| 579 | 581 | ||
| 580 | if (*object - bplist->data + size >= bplist->size) | 582 | if (*object - bplist->data + size >= bplist->size) |
| @@ -583,11 +585,12 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object) | |||
| 583 | 585 | ||
| 584 | case BPLIST_UNICODE: | 586 | case BPLIST_UNICODE: |
| 585 | if (BPLIST_FILL == size) { | 587 | if (BPLIST_FILL == size) { |
| 586 | plist_t size_node = parse_bin_node(bplist, object); | 588 | uint8_t next_size = **object & BPLIST_FILL; |
| 587 | if (plist_get_node_type(size_node) != PLIST_UINT) | 589 | if ((**object & BPLIST_MASK) != BPLIST_UINT) |
| 588 | return NULL; | 590 | return NULL; |
| 589 | plist_get_uint_val(size_node, &size); | 591 | (*object)++; |
| 590 | plist_free(size_node); | 592 | size = UINT_TO_HOST(*object, (1 << next_size)); |
| 593 | (*object) += (1 << next_size); | ||
| 591 | } | 594 | } |
| 592 | 595 | ||
| 593 | if (*object - bplist->data + size * 2 >= bplist->size) | 596 | if (*object - bplist->data + size * 2 >= bplist->size) |
| @@ -597,11 +600,12 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object) | |||
| 597 | case BPLIST_SET: | 600 | case BPLIST_SET: |
| 598 | case BPLIST_ARRAY: | 601 | case BPLIST_ARRAY: |
| 599 | if (BPLIST_FILL == size) { | 602 | if (BPLIST_FILL == size) { |
| 600 | plist_t size_node = parse_bin_node(bplist, object); | 603 | uint8_t next_size = **object & BPLIST_FILL; |
| 601 | if (plist_get_node_type(size_node) != PLIST_UINT) | 604 | if ((**object & BPLIST_MASK) != BPLIST_UINT) |
| 602 | return NULL; | 605 | return NULL; |
| 603 | plist_get_uint_val(size_node, &size); | 606 | (*object)++; |
| 604 | plist_free(size_node); | 607 | size = UINT_TO_HOST(*object, (1 << next_size)); |
| 608 | (*object) += (1 << next_size); | ||
| 605 | } | 609 | } |
| 606 | 610 | ||
| 607 | if (*object - bplist->data + size >= bplist->size) | 611 | if (*object - bplist->data + size >= bplist->size) |
| @@ -613,11 +617,12 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object) | |||
| 613 | 617 | ||
| 614 | case BPLIST_DICT: | 618 | case BPLIST_DICT: |
| 615 | if (BPLIST_FILL == size) { | 619 | if (BPLIST_FILL == size) { |
| 616 | plist_t size_node = parse_bin_node(bplist, object); | 620 | uint8_t next_size = **object & BPLIST_FILL; |
| 617 | if (plist_get_node_type(size_node) != PLIST_UINT) | 621 | if ((**object & BPLIST_MASK) != BPLIST_UINT) |
| 618 | return NULL; | 622 | return NULL; |
| 619 | plist_get_uint_val(size_node, &size); | 623 | (*object)++; |
| 620 | plist_free(size_node); | 624 | size = UINT_TO_HOST(*object, (1 << next_size)); |
| 625 | (*object) += (1 << next_size); | ||
| 621 | } | 626 | } |
| 622 | 627 | ||
| 623 | if (*object - bplist->data + size >= bplist->size) | 628 | if (*object - bplist->data + size >= bplist->size) |
