diff options
| author | 2017-02-05 05:22:56 +0100 | |
|---|---|---|
| committer | 2017-02-05 05:22:56 +0100 | |
| commit | 67eb54ab73f07560ae72058ed6ab6b47936be695 (patch) | |
| tree | 91c3811fb18aae97071675b208490eae240ed885 | |
| parent | 8e51cdc2c2bcd3bbed629ce76be055147c9ddbed (diff) | |
| download | libplist-67eb54ab73f07560ae72058ed6ab6b47936be695.tar.gz libplist-67eb54ab73f07560ae72058ed6ab6b47936be695.tar.bz2 | |
bplist: Make sure node data is always before the offset table
| -rw-r--r-- | src/bplist.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/src/bplist.c b/src/bplist.c index cdfea80..474025b 100644 --- a/src/bplist.c +++ b/src/bplist.c | |||
| @@ -374,7 +374,6 @@ static plist_t parse_dict_node(struct bplist_data *bplist, const char** bnode, u | |||
| 374 | uint64_t str_i = 0, str_j = 0; | 374 | uint64_t str_i = 0, str_j = 0; |
| 375 | uint64_t index1, index2; | 375 | uint64_t index1, index2; |
| 376 | plist_data_t data = plist_new_plist_data(); | 376 | plist_data_t data = plist_new_plist_data(); |
| 377 | const char *const end_data = bplist->data + bplist->size; | ||
| 378 | const char *index1_ptr = NULL; | 377 | const char *index1_ptr = NULL; |
| 379 | const char *index2_ptr = NULL; | 378 | const char *index2_ptr = NULL; |
| 380 | 379 | ||
| @@ -389,8 +388,8 @@ static plist_t parse_dict_node(struct bplist_data *bplist, const char** bnode, u | |||
| 389 | index1_ptr = (*bnode) + str_i; | 388 | index1_ptr = (*bnode) + str_i; |
| 390 | index2_ptr = (*bnode) + str_j; | 389 | index2_ptr = (*bnode) + str_j; |
| 391 | 390 | ||
| 392 | if ((index1_ptr < bplist->data || index1_ptr + bplist->ref_size >= end_data) || | 391 | if ((index1_ptr < bplist->data || index1_ptr + bplist->ref_size > bplist->offset_table) || |
| 393 | (index2_ptr < bplist->data || index2_ptr + bplist->ref_size >= end_data)) { | 392 | (index2_ptr < bplist->data || index2_ptr + bplist->ref_size > bplist->offset_table)) { |
| 394 | plist_free(node); | 393 | plist_free(node); |
| 395 | return NULL; | 394 | return NULL; |
| 396 | } | 395 | } |
| @@ -450,7 +449,6 @@ static plist_t parse_array_node(struct bplist_data *bplist, const char** bnode, | |||
| 450 | uint64_t str_j = 0; | 449 | uint64_t str_j = 0; |
| 451 | uint64_t index1; | 450 | uint64_t index1; |
| 452 | plist_data_t data = plist_new_plist_data(); | 451 | plist_data_t data = plist_new_plist_data(); |
| 453 | const char *const end_data = bplist->data + bplist->size; | ||
| 454 | const char *index1_ptr = NULL; | 452 | const char *index1_ptr = NULL; |
| 455 | 453 | ||
| 456 | data->type = PLIST_ARRAY; | 454 | data->type = PLIST_ARRAY; |
| @@ -462,7 +460,7 @@ static plist_t parse_array_node(struct bplist_data *bplist, const char** bnode, | |||
| 462 | str_j = j * bplist->ref_size; | 460 | str_j = j * bplist->ref_size; |
| 463 | index1_ptr = (*bnode) + str_j; | 461 | index1_ptr = (*bnode) + str_j; |
| 464 | 462 | ||
| 465 | if (index1_ptr < bplist->data || index1_ptr + bplist->ref_size >= end_data) { | 463 | if (index1_ptr < bplist->data || index1_ptr + bplist->ref_size > bplist->offset_table) { |
| 466 | plist_free(node); | 464 | plist_free(node); |
| 467 | return NULL; | 465 | return NULL; |
| 468 | } | 466 | } |
| @@ -530,7 +528,7 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object) | |||
| 530 | return NULL; | 528 | return NULL; |
| 531 | (*object)++; | 529 | (*object)++; |
| 532 | next_size = 1 << next_size; | 530 | next_size = 1 << next_size; |
| 533 | if (*object + next_size >= bplist->data + bplist->size) | 531 | if (*object + next_size > bplist->offset_table) |
| 534 | return NULL; | 532 | return NULL; |
| 535 | size = UINT_TO_HOST(*object, next_size); | 533 | size = UINT_TO_HOST(*object, next_size); |
| 536 | (*object) += next_size; | 534 | (*object) += next_size; |
| @@ -572,48 +570,50 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object) | |||
| 572 | } | 570 | } |
| 573 | 571 | ||
| 574 | case BPLIST_UINT: | 572 | case BPLIST_UINT: |
| 575 | if (*object - bplist->data + (uint64_t)(1 << size) >= bplist->size) | 573 | if (*object + (uint64_t)(1 << size) > bplist->offset_table) |
| 576 | return NULL; | 574 | return NULL; |
| 577 | return parse_uint_node(object, size); | 575 | return parse_uint_node(object, size); |
| 578 | 576 | ||
| 579 | case BPLIST_REAL: | 577 | case BPLIST_REAL: |
| 580 | if (*object - bplist->data + (uint64_t)(1 << size) >= bplist->size) | 578 | if (*object + (uint64_t)(1 << size) > bplist->offset_table) |
| 581 | return NULL; | 579 | return NULL; |
| 582 | return parse_real_node(object, size); | 580 | return parse_real_node(object, size); |
| 583 | 581 | ||
| 584 | case BPLIST_DATE: | 582 | case BPLIST_DATE: |
| 585 | if (3 != size) | 583 | if (3 != size) |
| 586 | return NULL; | 584 | return NULL; |
| 587 | if (*object - bplist->data + (uint64_t)(1 << size) >= bplist->size) | 585 | if (*object + (uint64_t)(1 << size) > bplist->offset_table) |
| 588 | return NULL; | 586 | return NULL; |
| 589 | return parse_date_node(object, size); | 587 | return parse_date_node(object, size); |
| 590 | 588 | ||
| 591 | case BPLIST_DATA: | 589 | case BPLIST_DATA: |
| 592 | if (*object - bplist->data + size >= bplist->size) | 590 | if (*object + size > bplist->offset_table) |
| 593 | return NULL; | 591 | return NULL; |
| 594 | return parse_data_node(object, size); | 592 | return parse_data_node(object, size); |
| 595 | 593 | ||
| 596 | case BPLIST_STRING: | 594 | case BPLIST_STRING: |
| 597 | if (*object - bplist->data + size >= bplist->size) | 595 | if (*object + size > bplist->offset_table) |
| 598 | return NULL; | 596 | return NULL; |
| 599 | return parse_string_node(object, size); | 597 | return parse_string_node(object, size); |
| 600 | 598 | ||
| 601 | case BPLIST_UNICODE: | 599 | case BPLIST_UNICODE: |
| 602 | if (*object - bplist->data + size * 2 >= bplist->size) | 600 | if (*object + size*2 > bplist->offset_table) |
| 603 | return NULL; | 601 | return NULL; |
| 604 | return parse_unicode_node(object, size); | 602 | return parse_unicode_node(object, size); |
| 605 | 603 | ||
| 606 | case BPLIST_SET: | 604 | case BPLIST_SET: |
| 607 | case BPLIST_ARRAY: | 605 | case BPLIST_ARRAY: |
| 608 | if (*object - bplist->data + size >= bplist->size) | 606 | if (*object + size > bplist->offset_table) |
| 609 | return NULL; | 607 | return NULL; |
| 610 | return parse_array_node(bplist, object, size); | 608 | return parse_array_node(bplist, object, size); |
| 611 | 609 | ||
| 612 | case BPLIST_UID: | 610 | case BPLIST_UID: |
| 611 | if (*object + size+1 > bplist->offset_table) | ||
| 612 | return NULL; | ||
| 613 | return parse_uid_node(object, size); | 613 | return parse_uid_node(object, size); |
| 614 | 614 | ||
| 615 | case BPLIST_DICT: | 615 | case BPLIST_DICT: |
| 616 | if (*object - bplist->data + size >= bplist->size) | 616 | if (*object + size > bplist->offset_table) |
| 617 | return NULL; | 617 | return NULL; |
| 618 | return parse_dict_node(bplist, object, size); | 618 | return parse_dict_node(bplist, object, size); |
| 619 | 619 | ||
