summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bplist.c28
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