diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/xplist.c | 18 |
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 | ||
| 627 | static void unescape_entities(char *str, size_t *length) | 627 | static 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 | ||
| 715 | static char* text_parts_get_content(text_part_t *tp, int unesc_entities, size_t *length, int *requires_free) | 716 | static 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; |
