summaryrefslogtreecommitdiffstats
path: root/src/bplist.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2017-02-03 23:26:54 +0100
committerGravatar Nikias Bassen2017-02-03 23:26:54 +0100
commit3ca4f0aeecfee240bfb37706dc37afe623d00512 (patch)
tree67726cf56f3d5101d0af6e3ae7f5cf753fc9df53 /src/bplist.c
parent4765d9a60ca4248a8f89289271ac69cbffcc29bc (diff)
downloadlibplist-3ca4f0aeecfee240bfb37706dc37afe623d00512.tar.gz
libplist-3ca4f0aeecfee240bfb37706dc37afe623d00512.tar.bz2
bplist: Unify size node parsing for data/string/array/dict nodes
Diffstat (limited to 'src/bplist.c')
-rw-r--r--src/bplist.c69
1 files changed, 24 insertions, 45 deletions
diff --git a/src/bplist.c b/src/bplist.c
index a73f1ee..1a40556 100644
--- a/src/bplist.c
+++ b/src/bplist.c
@@ -516,6 +516,29 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
516 size = (**object) & BPLIST_FILL; 516 size = (**object) & BPLIST_FILL;
517 (*object)++; 517 (*object)++;
518 518
519 if (size == BPLIST_FILL) {
520 switch (type) {
521 case BPLIST_DATA:
522 case BPLIST_STRING:
523 case BPLIST_UNICODE:
524 case BPLIST_ARRAY:
525 case BPLIST_SET:
526 case BPLIST_DICT:
527 {
528 uint16_t next_size = **object & BPLIST_FILL;
529 if ((**object & BPLIST_MASK) != BPLIST_UINT)
530 return NULL;
531 (*object)++;
532 next_size = 1 << next_size;
533 size = UINT_TO_HOST(*object, next_size);
534 (*object) += next_size;
535 break;
536 }
537 default:
538 break;
539 }
540 }
541
519 switch (type) 542 switch (type)
520 { 543 {
521 544
@@ -564,58 +587,22 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
564 return parse_date_node(object, size); 587 return parse_date_node(object, size);
565 588
566 case BPLIST_DATA: 589 case BPLIST_DATA:
567 if (BPLIST_FILL == size) {
568 uint8_t next_size = **object & BPLIST_FILL;
569 if ((**object & BPLIST_MASK) != BPLIST_UINT)
570 return NULL;
571 (*object)++;
572 size = UINT_TO_HOST(*object, (1 << next_size));
573 (*object) += (1 << next_size);
574 }
575
576 if (*object - bplist->data + size >= bplist->size) 590 if (*object - bplist->data + size >= bplist->size)
577 return NULL; 591 return NULL;
578 return parse_data_node(object, size); 592 return parse_data_node(object, size);
579 593
580 case BPLIST_STRING: 594 case BPLIST_STRING:
581 if (BPLIST_FILL == size) {
582 uint8_t next_size = **object & BPLIST_FILL;
583 if ((**object & BPLIST_MASK) != BPLIST_UINT)
584 return NULL;
585 (*object)++;
586 size = UINT_TO_HOST(*object, (1 << next_size));
587 (*object) += (1 << next_size);
588 }
589
590 if (*object - bplist->data + size >= bplist->size) 595 if (*object - bplist->data + size >= bplist->size)
591 return NULL; 596 return NULL;
592 return parse_string_node(object, size); 597 return parse_string_node(object, size);
593 598
594 case BPLIST_UNICODE: 599 case BPLIST_UNICODE:
595 if (BPLIST_FILL == size) {
596 uint8_t next_size = **object & BPLIST_FILL;
597 if ((**object & BPLIST_MASK) != BPLIST_UINT)
598 return NULL;
599 (*object)++;
600 size = UINT_TO_HOST(*object, (1 << next_size));
601 (*object) += (1 << next_size);
602 }
603
604 if (*object - bplist->data + size * 2 >= bplist->size) 600 if (*object - bplist->data + size * 2 >= bplist->size)
605 return NULL; 601 return NULL;
606 return parse_unicode_node(object, size); 602 return parse_unicode_node(object, size);
607 603
608 case BPLIST_SET: 604 case BPLIST_SET:
609 case BPLIST_ARRAY: 605 case BPLIST_ARRAY:
610 if (BPLIST_FILL == size) {
611 uint8_t next_size = **object & BPLIST_FILL;
612 if ((**object & BPLIST_MASK) != BPLIST_UINT)
613 return NULL;
614 (*object)++;
615 size = UINT_TO_HOST(*object, (1 << next_size));
616 (*object) += (1 << next_size);
617 }
618
619 if (*object - bplist->data + size >= bplist->size) 606 if (*object - bplist->data + size >= bplist->size)
620 return NULL; 607 return NULL;
621 return parse_array_node(bplist, object, size); 608 return parse_array_node(bplist, object, size);
@@ -624,18 +611,10 @@ static plist_t parse_bin_node(struct bplist_data *bplist, const char** object)
624 return parse_uid_node(object, size); 611 return parse_uid_node(object, size);
625 612
626 case BPLIST_DICT: 613 case BPLIST_DICT:
627 if (BPLIST_FILL == size) {
628 uint8_t next_size = **object & BPLIST_FILL;
629 if ((**object & BPLIST_MASK) != BPLIST_UINT)
630 return NULL;
631 (*object)++;
632 size = UINT_TO_HOST(*object, (1 << next_size));
633 (*object) += (1 << next_size);
634 }
635
636 if (*object - bplist->data + size >= bplist->size) 614 if (*object - bplist->data + size >= bplist->size)
637 return NULL; 615 return NULL;
638 return parse_dict_node(bplist, object, size); 616 return parse_dict_node(bplist, object, size);
617
639 default: 618 default:
640 return NULL; 619 return NULL;
641 } 620 }