summaryrefslogtreecommitdiffstats
path: root/src/xplist.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2016-12-21 02:36:34 +0100
committerGravatar Nikias Bassen2016-12-21 02:36:34 +0100
commit793228208a6523bdbe434ed536c5669e4bb04f7c (patch)
tree413322a8689cf5110934aad609abeceac7981896 /src/xplist.c
parentd18c8cb6bdc07d6eb04d8fccdeed4dcd32486876 (diff)
downloadlibplist-793228208a6523bdbe434ed536c5669e4bb04f7c.tar.gz
libplist-793228208a6523bdbe434ed536c5669e4bb04f7c.tar.bz2
xplist: Make sure to stop parsing on entity errors
Diffstat (limited to 'src/xplist.c')
-rw-r--r--src/xplist.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/xplist.c b/src/xplist.c
index 1fc3fc1..250b623 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -624,7 +624,7 @@ static text_part_t* get_text_parts(parse_ctx ctx, const char* tag, size_t tag_le
624 return parts; 624 return parts;
625} 625}
626 626
627static void unescape_entities(char *str, size_t *length) 627static int unescape_entities(char *str, size_t *length)
628{ 628{
629 size_t i = 0; 629 size_t i = 0;
630 size_t len = *length; 630 size_t len = *length;
@@ -655,24 +655,24 @@ static void unescape_entities(char *str, size_t *length)
655 char* ep = NULL; 655 char* ep = NULL;
656 if (entlen > 8) { 656 if (entlen > 8) {
657 PLIST_XML_ERR("Invalid numerical character reference encountered, sequence too long: &%.*s;\n", entlen, entp); 657 PLIST_XML_ERR("Invalid numerical character reference encountered, sequence too long: &%.*s;\n", entlen, entp);
658 return; 658 return -1;
659 } 659 }
660 if (*(entp+1) == 'x' || *(entp+1) == 'X') { 660 if (*(entp+1) == 'x' || *(entp+1) == 'X') {
661 if (entlen < 3) { 661 if (entlen < 3) {
662 PLIST_XML_ERR("Invalid numerical character reference encountered, sequence too short: &%.*s;\n", entlen, entp); 662 PLIST_XML_ERR("Invalid numerical character reference encountered, sequence too short: &%.*s;\n", entlen, entp);
663 return; 663 return -1;
664 } 664 }
665 val = strtoull(entp+2, &ep, 16); 665 val = strtoull(entp+2, &ep, 16);
666 } else { 666 } else {
667 if (entlen < 2) { 667 if (entlen < 2) {
668 PLIST_XML_ERR("Invalid numerical character reference encountered, sequence too short: &%.*s;\n", entlen, entp); 668 PLIST_XML_ERR("Invalid numerical character reference encountered, sequence too short: &%.*s;\n", entlen, entp);
669 return; 669 return -1;
670 } 670 }
671 val = strtoull(entp+1, &ep, 10); 671 val = strtoull(entp+1, &ep, 10);
672 } 672 }
673 if (val == 0 || val > 0x10FFFF || ep-entp != entlen) { 673 if (val == 0 || val > 0x10FFFF || ep-entp != entlen) {
674 PLIST_XML_ERR("Invalid numerical character reference found: &%.*s;\n", entlen, entp); 674 PLIST_XML_ERR("Invalid numerical character reference found: &%.*s;\n", entlen, entp);
675 return; 675 return -1;
676 } 676 }
677 /* convert to UTF8 */ 677 /* convert to UTF8 */
678 if (val >= 0x10000) { 678 if (val >= 0x10000) {
@@ -699,7 +699,7 @@ static void unescape_entities(char *str, size_t *length)
699 } 699 }
700 } else { 700 } else {
701 PLIST_XML_ERR("Invalid entity encountered: &%.*s;\n", entlen, entp); 701 PLIST_XML_ERR("Invalid entity encountered: &%.*s;\n", entlen, entp);
702 return; 702 return -1;
703 } 703 }
704 memmove(entp, str+i+1, len - i); 704 memmove(entp, str+i+1, len - i);
705 i -= entlen; 705 i -= entlen;
@@ -710,6 +710,7 @@ static void unescape_entities(char *str, size_t *length)
710 i++; 710 i++;
711 } 711 }
712 *length = len; 712 *length = len;
713 return 0;
713} 714}
714 715
715static char* text_parts_get_content(text_part_t *tp, int unesc_entities, size_t *length, int *requires_free) 716static char* text_parts_get_content(text_part_t *tp, int unesc_entities, size_t *length, int *requires_free)
@@ -743,7 +744,10 @@ static char* text_parts_get_content(text_part_t *tp, int unesc_entities, size_t
743 size_t len = tp->length; 744 size_t len = tp->length;
744 strncpy(p, tp->begin, len); 745 strncpy(p, tp->begin, len);
745 if (!tp->is_cdata && unesc_entities) { 746 if (!tp->is_cdata && unesc_entities) {
746 unescape_entities(p, &len); 747 if (unescape_entities(p, &len) < 0) {
748 free(str);
749 return NULL;
750 }
747 } 751 }
748 p += len; 752 p += len;
749 tp = tp->next; 753 tp = tp->next;