summaryrefslogtreecommitdiff
path: root/lib/xmlparse.c
diff options
context:
space:
mode:
authorkwaclaw <kwaclaw>2004-03-16 04:27:18 +0000
committerkwaclaw <kwaclaw>2004-03-16 04:27:18 +0000
commit11f1cc73b0c3a6ca079bc5682461f9fbdc0d7d5d (patch)
tree871dc929eb166ef505d038fac340a64146f41e8a /lib/xmlparse.c
parent9716d23c8c86b2c8712238ffd6edbabb468e8839 (diff)
downloadlibexpat-11f1cc73b0c3a6ca079bc5682461f9fbdc0d7d5d.tar.gz
Fixed the XML_GetCurrentLine/ColumnNumber() functions so that
they don't produce an access violation when the value of eventPtr is less than the value of positionPtr. This can happen when a handler raises an exception or potentially in some border cases. Also added some more updates of eventPtr.
Diffstat (limited to 'lib/xmlparse.c')
-rw-r--r--lib/xmlparse.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/xmlparse.c b/lib/xmlparse.c
index d90fc65..60e6ecf 100644
--- a/lib/xmlparse.c
+++ b/lib/xmlparse.c
@@ -1760,7 +1760,7 @@ XML_GetInputContext(XML_Parser parser, int *offset, int *size)
int XMLCALL
XML_GetCurrentLineNumber(XML_Parser parser)
{
- if (eventPtr) {
+ if (eventPtr && eventPtr >= positionPtr) {
XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
positionPtr = eventPtr;
}
@@ -1770,7 +1770,7 @@ XML_GetCurrentLineNumber(XML_Parser parser)
int XMLCALL
XML_GetCurrentColumnNumber(XML_Parser parser)
{
- if (eventPtr) {
+ if (eventPtr && eventPtr >= positionPtr) {
XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
positionPtr = eventPtr;
}
@@ -2043,8 +2043,12 @@ externalEntityInitProcessor3(XML_Parser parser,
const char *end,
const char **endPtr)
{
+ int tok;
const char *next = start; /* XmlContentTok doesn't always set the last arg */
- int tok = XmlContentTok(encoding, start, end, &next);
+ eventPtr = start;
+ tok = XmlContentTok(encoding, start, end, &next);
+ eventEndPtr = next;
+
switch (tok) {
case XML_TOK_XML_DECL:
{
@@ -2068,14 +2072,12 @@ externalEntityInitProcessor3(XML_Parser parser,
*endPtr = start;
return XML_ERROR_NONE;
}
- eventPtr = start;
return XML_ERROR_UNCLOSED_TOKEN;
case XML_TOK_PARTIAL_CHAR:
if (!finalBuffer) {
*endPtr = start;
return XML_ERROR_NONE;
}
- eventPtr = start;
return XML_ERROR_PARTIAL_CHAR;
}
processor = externalEntityContentProcessor;
@@ -3369,12 +3371,14 @@ entityValueInitProcessor(XML_Parser parser,
const char *end,
const char **nextPtr)
{
- const char *start = s;
- const char *next = s;
int tok;
+ const char *start = s;
+ const char *next = start;
+ eventPtr = start;
for (;;) {
tok = XmlPrologTok(encoding, start, end, &next);
+ eventEndPtr = next;
if (tok <= 0) {
if (!finalBuffer && tok != XML_TOK_INVALID) {
*nextPtr = s;
@@ -3424,6 +3428,7 @@ entityValueInitProcessor(XML_Parser parser,
return XML_ERROR_NONE;
}
start = next;
+ eventPtr = start;
}
}
@@ -4489,7 +4494,6 @@ epilogProcessor(XML_Parser parser,
/* report partial linebreak - it might be the last token */
case -XML_TOK_PROLOG_S:
if (defaultHandler) {
- eventEndPtr = next;
reportDefault(parser, encoding, s, next);
if (parsing == XML_FINISHED)
return XML_ERROR_ABORTED;