summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@mit.edu>2012-05-15 20:10:25 +0800
committerDaniel Veillard <veillard@redhat.com>2012-05-15 20:10:25 +0800
commit9d9685ad88c17d35b6688695af3ceba7c7309b13 (patch)
tree0972d7e3dde7faab3e42c2b60808578356843f48
parent1ea6b1412508776b788ad6056dc9fc11fd6c7227 (diff)
downloadlibxml2-2.8.0-rc1.tar.gz
xmlTextReader bails too quickly on errorv2.8.0-rc1
For https://bugzilla.gnome.org/show_bug.cgi?id=654567 I use xmlTextReader to parse failed that might be incomplete. These files are the beginning of a well-formed file, but the end is missing so the file as a whole is not well-formed. The problem is that xmlTextReader starts returning errors when it encounters the early EOF, even though I haven't finished reading all of the valid data in the file. It would be helpful if xmlTextReader kept working until the very end.
-rw-r--r--xmlreader.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/xmlreader.c b/xmlreader.c
index c5ab60ec..77ac71b7 100644
--- a/xmlreader.c
+++ b/xmlreader.c
@@ -855,16 +855,18 @@ xmlTextReaderPushData(xmlTextReaderPtr reader) {
(const char *) &inbuf->content[reader->cur],
CHUNK_SIZE, 0);
reader->cur += CHUNK_SIZE;
- if ((val != 0) || (reader->ctxt->wellFormed == 0))
- return(-1);
+ if (val != 0)
+ reader->ctxt->wellFormed = 0;
+ if (reader->ctxt->wellFormed == 0)
+ break;
} else {
s = inbuf->use - reader->cur;
val = xmlParseChunk(reader->ctxt,
(const char *) &inbuf->content[reader->cur],
s, 0);
reader->cur += s;
- if ((val != 0) || (reader->ctxt->wellFormed == 0))
- return(-1);
+ if (val != 0)
+ reader->ctxt->wellFormed = 0;
break;
}
}
@@ -896,11 +898,17 @@ xmlTextReaderPushData(xmlTextReaderPtr reader) {
s, 1);
reader->cur = inbuf->use;
reader->state = XML_TEXTREADER_DONE;
- if ((val != 0) || (reader->ctxt->wellFormed == 0))
- return(-1);
+ if (val != 0) {
+ if (reader->ctxt->wellFormed)
+ reader->ctxt->wellFormed = 0;
+ else
+ return(-1);
+ }
}
}
reader->state = oldstate;
+ if (reader->ctxt->wellFormed == 0)
+ reader->mode = XML_TEXTREADER_MODE_EOF;
return(0);
}
@@ -1265,8 +1273,6 @@ xmlTextReaderRead(xmlTextReaderPtr reader) {
return(xmlTextReaderReadTree(reader));
if (reader->ctxt == NULL)
return(-1);
- if (reader->ctxt->wellFormed != 1)
- return(-1);
#ifdef DEBUG_READER
fprintf(stderr, "\nREAD ");