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.
This commit is contained in:
Karl Waclawek 2004-03-16 04:27:18 +00:00
parent 2a3e8fa423
commit 86f4b1471b

View file

@ -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;