diff options
| author | 2017-01-01 21:23:15 +0100 | |
|---|---|---|
| committer | 2017-01-01 21:23:15 +0100 | |
| commit | c2ea55aa6cac25934c08a5408e6ad23ab69e824a (patch) | |
| tree | d04ac91ca6919cbb310d4263bd50b9e0e687aa44 /src | |
| parent | be2b1690a3ecb97620f01669b1b8ac556181db48 (diff) | |
| download | libplist-c2ea55aa6cac25934c08a5408e6ad23ab69e824a.tar.gz libplist-c2ea55aa6cac25934c08a5408e6ad23ab69e824a.tar.bz2 | |
xplist: Fix numerical character entity conversion
Diffstat (limited to 'src')
| -rw-r--r-- | src/xplist.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/xplist.c b/src/xplist.c index 68fd3ab..11b7400 100644 --- a/src/xplist.c +++ b/src/xplist.c | |||
| @@ -639,6 +639,7 @@ static int unescape_entities(char *str, size_t *length) | |||
| 639 | } | 639 | } |
| 640 | if (str+i >= entp+1) { | 640 | if (str+i >= entp+1) { |
| 641 | int entlen = str+i - entp; | 641 | int entlen = str+i - entp; |
| 642 | int bytelen = 1; | ||
| 642 | if (!strncmp(entp, "amp", 3)) { | 643 | if (!strncmp(entp, "amp", 3)) { |
| 643 | /* the '&' is already there */ | 644 | /* the '&' is already there */ |
| 644 | } else if (!strncmp(entp, "apos", 4)) { | 645 | } else if (!strncmp(entp, "apos", 4)) { |
| @@ -682,17 +683,20 @@ static int unescape_entities(char *str, size_t *length) | |||
| 682 | *(entp+1) = (char)(0x80 + ((val >> 6) & 0x3F)); | 683 | *(entp+1) = (char)(0x80 + ((val >> 6) & 0x3F)); |
| 683 | *(entp+2) = (char)(0x80 + (val & 0x3F)); | 684 | *(entp+2) = (char)(0x80 + (val & 0x3F)); |
| 684 | entp+=3; | 685 | entp+=3; |
| 686 | bytelen = 4; | ||
| 685 | } else if (val >= 0x800) { | 687 | } else if (val >= 0x800) { |
| 686 | /* three bytes */ | 688 | /* three bytes */ |
| 687 | *(entp-1) = (char)(0xE0 + ((val >> 12) & 0xF)); | 689 | *(entp-1) = (char)(0xE0 + ((val >> 12) & 0xF)); |
| 688 | *(entp+0) = (char)(0x80 + ((val >> 6) & 0x3F)); | 690 | *(entp+0) = (char)(0x80 + ((val >> 6) & 0x3F)); |
| 689 | *(entp+1) = (char)(0x80 + (val & 0x3F)); | 691 | *(entp+1) = (char)(0x80 + (val & 0x3F)); |
| 690 | entp+=2; | 692 | entp+=2; |
| 693 | bytelen = 3; | ||
| 691 | } else if (val >= 0x80) { | 694 | } else if (val >= 0x80) { |
| 692 | /* two bytes */ | 695 | /* two bytes */ |
| 693 | *(entp-1) = (char)(0xC0 + ((val >> 6) & 0x1F)); | 696 | *(entp-1) = (char)(0xC0 + ((val >> 6) & 0x1F)); |
| 694 | *(entp+0) = (char)(0x80 + (val & 0x3F)); | 697 | *(entp+0) = (char)(0x80 + (val & 0x3F)); |
| 695 | entp++; | 698 | entp++; |
| 699 | bytelen = 2; | ||
| 696 | } else { | 700 | } else { |
| 697 | /* one byte */ | 701 | /* one byte */ |
| 698 | *(entp-1) = (char)(val & 0x7F); | 702 | *(entp-1) = (char)(val & 0x7F); |
| @@ -702,8 +706,8 @@ static int unescape_entities(char *str, size_t *length) | |||
| 702 | return -1; | 706 | return -1; |
| 703 | } | 707 | } |
| 704 | memmove(entp, str+i+1, len - i); | 708 | memmove(entp, str+i+1, len - i); |
| 705 | i -= entlen; | 709 | i -= entlen+1 - bytelen; |
| 706 | len -= (entlen+1); | 710 | len -= entlen+2 - bytelen; |
| 707 | continue; | 711 | continue; |
| 708 | } | 712 | } |
| 709 | } | 713 | } |
