summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2017-01-01 21:23:15 +0100
committerGravatar Nikias Bassen2017-01-01 21:23:15 +0100
commitc2ea55aa6cac25934c08a5408e6ad23ab69e824a (patch)
treed04ac91ca6919cbb310d4263bd50b9e0e687aa44 /src
parentbe2b1690a3ecb97620f01669b1b8ac556181db48 (diff)
downloadlibplist-c2ea55aa6cac25934c08a5408e6ad23ab69e824a.tar.gz
libplist-c2ea55aa6cac25934c08a5408e6ad23ab69e824a.tar.bz2
xplist: Fix numerical character entity conversion
Diffstat (limited to 'src')
-rw-r--r--src/xplist.c8
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 }