Index: third_party/expat/files/lib/xmltok.c.origin |
diff --git a/third_party/expat/files/lib/xmltok.c b/third_party/expat/files/lib/xmltok.c.origin |
similarity index 87% |
copy from third_party/expat/files/lib/xmltok.c |
copy to third_party/expat/files/lib/xmltok.c.origin |
index bf09dfc72b9fc85384f06850284d21c96ebc1cfa..a29d9e2f8ac386b213099b8bbfb9b3a2dc1289a8 100644 |
--- a/third_party/expat/files/lib/xmltok.c |
+++ b/third_party/expat/files/lib/xmltok.c.origin |
@@ -4,7 +4,7 @@ |
#include <stddef.h> |
-#ifdef COMPILED_FROM_DSP |
+#ifdef WIN32 |
#include "winconfig.h" |
#elif defined(MACOS_CLASSIC) |
#include "macconfig.h" |
@@ -16,7 +16,7 @@ |
#ifdef HAVE_EXPAT_CONFIG_H |
#include <expat_config.h> |
#endif |
-#endif /* ndef COMPILED_FROM_DSP */ |
+#endif /* ndef WIN32 */ |
#include "expat_external.h" |
#include "internal.h" |
@@ -46,7 +46,7 @@ |
#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) |
#define UCS2_GET_NAMING(pages, hi, lo) \ |
- (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) |
+ (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo) & 0x1F))) |
/* A 2 byte UTF-8 representation splits the characters 11 bits between |
the bottom 5 and 6 bits of the bytes. We need 8 bits to index into |
@@ -56,7 +56,7 @@ |
(namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ |
+ ((((byte)[0]) & 3) << 1) \ |
+ ((((byte)[1]) >> 5) & 1)] \ |
- & (1 << (((byte)[1]) & 0x1F))) |
+ & (1u << (((byte)[1]) & 0x1F))) |
/* A 3 byte UTF-8 representation splits the characters 16 bits between |
the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index |
@@ -69,7 +69,7 @@ |
<< 3) \ |
+ ((((byte)[1]) & 3) << 1) \ |
+ ((((byte)[2]) >> 5) & 1)] \ |
- & (1 << (((byte)[2]) & 0x1F))) |
+ & (1u << (((byte)[2]) & 0x1F))) |
#define UTF8_GET_NAMING(pages, p, n) \ |
((n) == 2 \ |
@@ -122,19 +122,19 @@ |
((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) |
static int PTRFASTCALL |
-isNever(const ENCODING *enc, const char *p) |
+isNever(const ENCODING *UNUSED_P(enc), const char *UNUSED_P(p)) |
{ |
return 0; |
} |
static int PTRFASTCALL |
-utf8_isName2(const ENCODING *enc, const char *p) |
+utf8_isName2(const ENCODING *UNUSED_P(enc), const char *p) |
{ |
return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); |
} |
static int PTRFASTCALL |
-utf8_isName3(const ENCODING *enc, const char *p) |
+utf8_isName3(const ENCODING *UNUSED_P(enc), const char *p) |
{ |
return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); |
} |
@@ -142,13 +142,13 @@ utf8_isName3(const ENCODING *enc, const char *p) |
#define utf8_isName4 isNever |
static int PTRFASTCALL |
-utf8_isNmstrt2(const ENCODING *enc, const char *p) |
+utf8_isNmstrt2(const ENCODING *UNUSED_P(enc), const char *p) |
{ |
return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); |
} |
static int PTRFASTCALL |
-utf8_isNmstrt3(const ENCODING *enc, const char *p) |
+utf8_isNmstrt3(const ENCODING *UNUSED_P(enc), const char *p) |
{ |
return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); |
} |
@@ -156,19 +156,19 @@ utf8_isNmstrt3(const ENCODING *enc, const char *p) |
#define utf8_isNmstrt4 isNever |
static int PTRFASTCALL |
-utf8_isInvalid2(const ENCODING *enc, const char *p) |
+utf8_isInvalid2(const ENCODING *UNUSED_P(enc), const char *p) |
{ |
return UTF8_INVALID2((const unsigned char *)p); |
} |
static int PTRFASTCALL |
-utf8_isInvalid3(const ENCODING *enc, const char *p) |
+utf8_isInvalid3(const ENCODING *UNUSED_P(enc), const char *p) |
{ |
return UTF8_INVALID3((const unsigned char *)p); |
} |
static int PTRFASTCALL |
-utf8_isInvalid4(const ENCODING *enc, const char *p) |
+utf8_isInvalid4(const ENCODING *UNUSED_P(enc), const char *p) |
{ |
return UTF8_INVALID4((const unsigned char *)p); |
} |
@@ -222,6 +222,17 @@ struct normal_encoding { |
E ## isInvalid3, \ |
E ## isInvalid4 |
+#define NULL_VTABLE \ |
+ /* isName2 */ NULL, \ |
+ /* isName3 */ NULL, \ |
+ /* isName4 */ NULL, \ |
+ /* isNmstrt2 */ NULL, \ |
+ /* isNmstrt3 */ NULL, \ |
+ /* isNmstrt4 */ NULL, \ |
+ /* isInvalid2 */ NULL, \ |
+ /* isInvalid3 */ NULL, \ |
+ /* isInvalid4 */ NULL |
+ |
static int FASTCALL checkCharRefNumber(int); |
#include "xmltok_impl.h" |
@@ -318,39 +329,89 @@ enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ |
UTF8_cval4 = 0xf0 |
}; |
-static void PTRCALL |
-utf8_toUtf8(const ENCODING *enc, |
+void |
+align_limit_to_full_utf8_characters(const char * from, const char ** fromLimRef) |
+{ |
+ const char * fromLim = *fromLimRef; |
+ size_t walked = 0; |
+ for (; fromLim > from; fromLim--, walked++) { |
+ const unsigned char prev = (unsigned char)fromLim[-1]; |
+ if ((prev & 0xf8u) == 0xf0u) { /* 4-byte character, lead by 0b11110xxx byte */ |
+ if (walked + 1 >= 4) { |
+ fromLim += 4 - 1; |
+ break; |
+ } else { |
+ walked = 0; |
+ } |
+ } else if ((prev & 0xf0u) == 0xe0u) { /* 3-byte character, lead by 0b1110xxxx byte */ |
+ if (walked + 1 >= 3) { |
+ fromLim += 3 - 1; |
+ break; |
+ } else { |
+ walked = 0; |
+ } |
+ } else if ((prev & 0xe0u) == 0xc0u) { /* 2-byte character, lead by 0b110xxxxx byte */ |
+ if (walked + 1 >= 2) { |
+ fromLim += 2 - 1; |
+ break; |
+ } else { |
+ walked = 0; |
+ } |
+ } else if ((prev & 0x80u) == 0x00u) { /* 1-byte character, matching 0b0xxxxxxx */ |
+ break; |
+ } |
+ } |
+ *fromLimRef = fromLim; |
+} |
+ |
+static enum XML_Convert_Result PTRCALL |
+utf8_toUtf8(const ENCODING *UNUSED_P(enc), |
const char **fromP, const char *fromLim, |
char **toP, const char *toLim) |
{ |
+ enum XML_Convert_Result res = XML_CONVERT_COMPLETED; |
char *to; |
const char *from; |
if (fromLim - *fromP > toLim - *toP) { |
/* Avoid copying partial characters. */ |
- for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) |
- if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) |
- break; |
+ res = XML_CONVERT_OUTPUT_EXHAUSTED; |
+ fromLim = *fromP + (toLim - *toP); |
+ align_limit_to_full_utf8_characters(*fromP, &fromLim); |
} |
- for (to = *toP, from = *fromP; from != fromLim; from++, to++) |
+ for (to = *toP, from = *fromP; (from < fromLim) && (to < toLim); from++, to++) |
*to = *from; |
*fromP = from; |
*toP = to; |
+ |
+ if ((to == toLim) && (from < fromLim)) |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
+ else |
+ return res; |
} |
-static void PTRCALL |
+static enum XML_Convert_Result PTRCALL |
utf8_toUtf16(const ENCODING *enc, |
const char **fromP, const char *fromLim, |
unsigned short **toP, const unsigned short *toLim) |
{ |
+ enum XML_Convert_Result res = XML_CONVERT_COMPLETED; |
unsigned short *to = *toP; |
const char *from = *fromP; |
- while (from != fromLim && to != toLim) { |
+ while (from < fromLim && to < toLim) { |
switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { |
case BT_LEAD2: |
+ if (fromLim - from < 2) { |
+ res = XML_CONVERT_INPUT_INCOMPLETE; |
+ break; |
+ } |
*to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); |
from += 2; |
break; |
case BT_LEAD3: |
+ if (fromLim - from < 3) { |
+ res = XML_CONVERT_INPUT_INCOMPLETE; |
+ break; |
+ } |
*to++ = (unsigned short)(((from[0] & 0xf) << 12) |
| ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); |
from += 3; |
@@ -358,8 +419,14 @@ utf8_toUtf16(const ENCODING *enc, |
case BT_LEAD4: |
{ |
unsigned long n; |
- if (to + 1 == toLim) |
+ if (toLim - to < 2) { |
+ res = XML_CONVERT_OUTPUT_EXHAUSTED; |
goto after; |
+ } |
+ if (fromLim - from < 4) { |
+ res = XML_CONVERT_INPUT_INCOMPLETE; |
+ goto after; |
+ } |
n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) |
| ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); |
n -= 0x10000; |
@@ -377,6 +444,7 @@ utf8_toUtf16(const ENCODING *enc, |
after: |
*fromP = from; |
*toP = to; |
+ return res; |
} |
#ifdef XML_NS |
@@ -425,38 +493,43 @@ static const struct normal_encoding internal_utf8_encoding = { |
STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) |
}; |
-static void PTRCALL |
-latin1_toUtf8(const ENCODING *enc, |
+static enum XML_Convert_Result PTRCALL |
+latin1_toUtf8(const ENCODING *UNUSED_P(enc), |
const char **fromP, const char *fromLim, |
char **toP, const char *toLim) |
{ |
for (;;) { |
unsigned char c; |
if (*fromP == fromLim) |
- break; |
+ return XML_CONVERT_COMPLETED; |
c = (unsigned char)**fromP; |
if (c & 0x80) { |
if (toLim - *toP < 2) |
- break; |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
*(*toP)++ = (char)((c >> 6) | UTF8_cval2); |
*(*toP)++ = (char)((c & 0x3f) | 0x80); |
(*fromP)++; |
} |
else { |
if (*toP == toLim) |
- break; |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
*(*toP)++ = *(*fromP)++; |
} |
} |
} |
-static void PTRCALL |
-latin1_toUtf16(const ENCODING *enc, |
+static enum XML_Convert_Result PTRCALL |
+latin1_toUtf16(const ENCODING *UNUSED_P(enc), |
const char **fromP, const char *fromLim, |
unsigned short **toP, const unsigned short *toLim) |
{ |
- while (*fromP != fromLim && *toP != toLim) |
+ while (*fromP < fromLim && *toP < toLim) |
*(*toP)++ = (unsigned char)*(*fromP)++; |
+ |
+ if ((*toP == toLim) && (*fromP < fromLim)) |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
+ else |
+ return XML_CONVERT_COMPLETED; |
} |
#ifdef XML_NS |
@@ -467,7 +540,7 @@ static const struct normal_encoding latin1_encoding_ns = { |
#include "asciitab.h" |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(sb_) |
+ STANDARD_VTABLE(sb_) NULL_VTABLE |
}; |
#endif |
@@ -480,16 +553,21 @@ static const struct normal_encoding latin1_encoding = { |
#undef BT_COLON |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(sb_) |
+ STANDARD_VTABLE(sb_) NULL_VTABLE |
}; |
-static void PTRCALL |
-ascii_toUtf8(const ENCODING *enc, |
+static enum XML_Convert_Result PTRCALL |
+ascii_toUtf8(const ENCODING *UNUSED_P(enc), |
const char **fromP, const char *fromLim, |
char **toP, const char *toLim) |
{ |
- while (*fromP != fromLim && *toP != toLim) |
+ while (*fromP < fromLim && *toP < toLim) |
*(*toP)++ = *(*fromP)++; |
+ |
+ if ((*toP == toLim) && (*fromP < fromLim)) |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
+ else |
+ return XML_CONVERT_COMPLETED; |
} |
#ifdef XML_NS |
@@ -500,7 +578,7 @@ static const struct normal_encoding ascii_encoding_ns = { |
#include "asciitab.h" |
/* BT_NONXML == 0 */ |
}, |
- STANDARD_VTABLE(sb_) |
+ STANDARD_VTABLE(sb_) NULL_VTABLE |
}; |
#endif |
@@ -513,7 +591,7 @@ static const struct normal_encoding ascii_encoding = { |
#undef BT_COLON |
/* BT_NONXML == 0 */ |
}, |
- STANDARD_VTABLE(sb_) |
+ STANDARD_VTABLE(sb_) NULL_VTABLE |
}; |
static int PTRFASTCALL |
@@ -536,13 +614,14 @@ unicode_byte_type(char hi, char lo) |
} |
#define DEFINE_UTF16_TO_UTF8(E) \ |
-static void PTRCALL \ |
-E ## toUtf8(const ENCODING *enc, \ |
+static enum XML_Convert_Result PTRCALL \ |
+E ## toUtf8(const ENCODING *UNUSED_P(enc), \ |
const char **fromP, const char *fromLim, \ |
char **toP, const char *toLim) \ |
{ \ |
- const char *from; \ |
- for (from = *fromP; from != fromLim; from += 2) { \ |
+ const char *from = *fromP; \ |
+ fromLim = from + (((fromLim - from) >> 1) << 1); /* shrink to even */ \ |
+ for (; from < fromLim; from += 2) { \ |
int plane; \ |
unsigned char lo2; \ |
unsigned char lo = GET_LO(from); \ |
@@ -552,7 +631,7 @@ E ## toUtf8(const ENCODING *enc, \ |
if (lo < 0x80) { \ |
if (*toP == toLim) { \ |
*fromP = from; \ |
- return; \ |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \ |
} \ |
*(*toP)++ = lo; \ |
break; \ |
@@ -562,7 +641,7 @@ E ## toUtf8(const ENCODING *enc, \ |
case 0x4: case 0x5: case 0x6: case 0x7: \ |
if (toLim - *toP < 2) { \ |
*fromP = from; \ |
- return; \ |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \ |
} \ |
*(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ |
*(*toP)++ = ((lo & 0x3f) | 0x80); \ |
@@ -570,7 +649,7 @@ E ## toUtf8(const ENCODING *enc, \ |
default: \ |
if (toLim - *toP < 3) { \ |
*fromP = from; \ |
- return; \ |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \ |
} \ |
/* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ |
*(*toP)++ = ((hi >> 4) | UTF8_cval3); \ |
@@ -580,7 +659,11 @@ E ## toUtf8(const ENCODING *enc, \ |
case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ |
if (toLim - *toP < 4) { \ |
*fromP = from; \ |
- return; \ |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \ |
+ } \ |
+ if (fromLim - from < 4) { \ |
+ *fromP = from; \ |
+ return XML_CONVERT_INPUT_INCOMPLETE; \ |
} \ |
plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ |
*(*toP)++ = ((plane >> 2) | UTF8_cval4); \ |
@@ -596,20 +679,32 @@ E ## toUtf8(const ENCODING *enc, \ |
} \ |
} \ |
*fromP = from; \ |
+ if (from < fromLim) \ |
+ return XML_CONVERT_INPUT_INCOMPLETE; \ |
+ else \ |
+ return XML_CONVERT_COMPLETED; \ |
} |
#define DEFINE_UTF16_TO_UTF16(E) \ |
-static void PTRCALL \ |
-E ## toUtf16(const ENCODING *enc, \ |
+static enum XML_Convert_Result PTRCALL \ |
+E ## toUtf16(const ENCODING *UNUSED_P(enc), \ |
const char **fromP, const char *fromLim, \ |
unsigned short **toP, const unsigned short *toLim) \ |
{ \ |
+ enum XML_Convert_Result res = XML_CONVERT_COMPLETED; \ |
+ fromLim = *fromP + (((fromLim - *fromP) >> 1) << 1); /* shrink to even */ \ |
/* Avoid copying first half only of surrogate */ \ |
if (fromLim - *fromP > ((toLim - *toP) << 1) \ |
- && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ |
+ && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) { \ |
fromLim -= 2; \ |
- for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ |
+ res = XML_CONVERT_INPUT_INCOMPLETE; \ |
+ } \ |
+ for (; *fromP < fromLim && *toP < toLim; *fromP += 2) \ |
*(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ |
+ if ((*toP == toLim) && (*fromP < fromLim)) \ |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \ |
+ else \ |
+ return res; \ |
} |
#define SET2(ptr, ch) \ |
@@ -726,7 +821,7 @@ static const struct normal_encoding little2_encoding_ns = { |
#include "asciitab.h" |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(little2_) |
+ STANDARD_VTABLE(little2_) NULL_VTABLE |
}; |
#endif |
@@ -745,7 +840,7 @@ static const struct normal_encoding little2_encoding = { |
#undef BT_COLON |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(little2_) |
+ STANDARD_VTABLE(little2_) NULL_VTABLE |
}; |
#if BYTEORDER != 4321 |
@@ -758,7 +853,7 @@ static const struct normal_encoding internal_little2_encoding_ns = { |
#include "iasciitab.h" |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(little2_) |
+ STANDARD_VTABLE(little2_) NULL_VTABLE |
}; |
#endif |
@@ -771,7 +866,7 @@ static const struct normal_encoding internal_little2_encoding = { |
#undef BT_COLON |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(little2_) |
+ STANDARD_VTABLE(little2_) NULL_VTABLE |
}; |
#endif |
@@ -867,7 +962,7 @@ static const struct normal_encoding big2_encoding_ns = { |
#include "asciitab.h" |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(big2_) |
+ STANDARD_VTABLE(big2_) NULL_VTABLE |
}; |
#endif |
@@ -886,7 +981,7 @@ static const struct normal_encoding big2_encoding = { |
#undef BT_COLON |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(big2_) |
+ STANDARD_VTABLE(big2_) NULL_VTABLE |
}; |
#if BYTEORDER != 1234 |
@@ -899,7 +994,7 @@ static const struct normal_encoding internal_big2_encoding_ns = { |
#include "iasciitab.h" |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(big2_) |
+ STANDARD_VTABLE(big2_) NULL_VTABLE |
}; |
#endif |
@@ -912,7 +1007,7 @@ static const struct normal_encoding internal_big2_encoding = { |
#undef BT_COLON |
#include "latin1tab.h" |
}, |
- STANDARD_VTABLE(big2_) |
+ STANDARD_VTABLE(big2_) NULL_VTABLE |
}; |
#endif |
@@ -938,7 +1033,7 @@ streqci(const char *s1, const char *s2) |
} |
static void PTRCALL |
-initUpdatePosition(const ENCODING *enc, const char *ptr, |
+initUpdatePosition(const ENCODING *UNUSED_P(enc), const char *ptr, |
const char *end, POSITION *pos) |
{ |
normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); |
@@ -1288,7 +1383,7 @@ unknown_isInvalid(const ENCODING *enc, const char *p) |
return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; |
} |
-static void PTRCALL |
+static enum XML_Convert_Result PTRCALL |
unknown_toUtf8(const ENCODING *enc, |
const char **fromP, const char *fromLim, |
char **toP, const char *toLim) |
@@ -1299,21 +1394,21 @@ unknown_toUtf8(const ENCODING *enc, |
const char *utf8; |
int n; |
if (*fromP == fromLim) |
- break; |
+ return XML_CONVERT_COMPLETED; |
utf8 = uenc->utf8[(unsigned char)**fromP]; |
n = *utf8++; |
if (n == 0) { |
int c = uenc->convert(uenc->userData, *fromP); |
n = XmlUtf8Encode(c, buf); |
if (n > toLim - *toP) |
- break; |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
utf8 = buf; |
*fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] |
- (BT_LEAD2 - 2)); |
} |
else { |
if (n > toLim - *toP) |
- break; |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
(*fromP)++; |
} |
do { |
@@ -1322,13 +1417,13 @@ unknown_toUtf8(const ENCODING *enc, |
} |
} |
-static void PTRCALL |
+static enum XML_Convert_Result PTRCALL |
unknown_toUtf16(const ENCODING *enc, |
const char **fromP, const char *fromLim, |
unsigned short **toP, const unsigned short *toLim) |
{ |
const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); |
- while (*fromP != fromLim && *toP != toLim) { |
+ while (*fromP < fromLim && *toP < toLim) { |
unsigned short c = uenc->utf16[(unsigned char)**fromP]; |
if (c == 0) { |
c = (unsigned short) |
@@ -1340,6 +1435,11 @@ unknown_toUtf16(const ENCODING *enc, |
(*fromP)++; |
*(*toP)++ = c; |
} |
+ |
+ if ((*toP == toLim) && (*fromP < fromLim)) |
+ return XML_CONVERT_OUTPUT_EXHAUSTED; |
+ else |
+ return XML_CONVERT_COMPLETED; |
} |
ENCODING * |
@@ -1503,7 +1603,7 @@ initScan(const ENCODING * const *encodingTable, |
{ |
const ENCODING **encPtr; |
- if (ptr == end) |
+ if (ptr >= end) |
return XML_TOK_NONE; |
encPtr = enc->encPtr; |
if (ptr + 1 == end) { |