summaryrefslogtreecommitdiff
path: root/ext/xml/xml.c
diff options
context:
space:
mode:
authorRasmus Lerdorf <rasmus@php.net>2008-01-29 23:21:20 +0000
committerRasmus Lerdorf <rasmus@php.net>2008-01-29 23:21:20 +0000
commit7b624a37bc89019c33bbddb656f287ca82f8ddbc (patch)
treee9d72d1fda57ebd318eb64b195f8ee4c02a8a77d /ext/xml/xml.c
parent088d2d98b8294ef53209356b407c3b10070396c1 (diff)
downloadphp-git-7b624a37bc89019c33bbddb656f287ca82f8ddbc.tar.gz
Fixed bug #43957 (utf8_decode() bogus conversion of partial multibyte UTF8 char)
Diffstat (limited to 'ext/xml/xml.c')
-rw-r--r--ext/xml/xml.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/ext/xml/xml.c b/ext/xml/xml.c
index b9de7a9bd9..14bf2ff9e8 100644
--- a/ext/xml/xml.c
+++ b/ext/xml/xml.c
@@ -579,15 +579,27 @@ PHPAPI char *xml_utf8_decode(const XML_Char *s, int len, int *newlen, const XML_
while (pos > 0) {
c = (unsigned char)(*s);
if (c >= 0xf0) { /* four bytes encoded, 21 bits */
- c = ((s[0]&7)<<18) | ((s[1]&63)<<12) | ((s[2]&63)<<6) | (s[3]&63);
+ if(pos-4 >= 0) {
+ c = ((s[0]&7)<<18) | ((s[1]&63)<<12) | ((s[2]&63)<<6) | (s[3]&63);
+ } else {
+ c = '?';
+ }
s += 4;
pos -= 4;
} else if (c >= 0xe0) { /* three bytes encoded, 16 bits */
- c = ((s[0]&63)<<12) | ((s[1]&63)<<6) | (s[2]&63);
+ if(pos-3 >= 0) {
+ c = ((s[0]&63)<<12) | ((s[1]&63)<<6) | (s[2]&63);
+ } else {
+ c = '?';
+ }
s += 3;
pos -= 3;
} else if (c >= 0xc0) { /* two bytes encoded, 11 bits */
- c = ((s[0]&63)<<6) | (s[1]&63);
+ if(pos-3 >= 0) {
+ c = ((s[0]&63)<<6) | (s[1]&63);
+ } else {
+ c = '?';
+ }
s += 2;
pos -= 2;
} else {