diff --git a/ChangeLog b/ChangeLog index 5e5883f2..11a61625 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Oct 14 13:12:55 CEST 2002 Daniel Veillard + + * parser.c: Christian Glahn found a small bug in the push parser. + * xmlIO.c include/libxml/xmlIO.h: cleaned up and made xmlCheckFilename + public + Wed Oct 9 23:11:02 CEST 2002 Daniel Veillard * xmlschemas.c include/libxml/xmlschemas.h: added diff --git a/include/libxml/xmlIO.h b/include/libxml/xmlIO.h index 7daa717e..d0ef8d67 100644 --- a/include/libxml/xmlIO.h +++ b/include/libxml/xmlIO.h @@ -254,6 +254,7 @@ xmlParserInputPtr xmlNoNetExternalEntityLoader(const char *URL, xmlChar *xmlNormalizeWindowsPath (const xmlChar *path); +int xmlCheckFilename (const char *path); /** * Default 'file://' protocol callbacks */ diff --git a/parser.c b/parser.c index 7311c9ef..2c579543 100644 --- a/parser.c +++ b/parser.c @@ -8894,6 +8894,14 @@ xmlParseChunk(xmlParserCtxtPtr ctxt, const char *chunk, int size, /* * Check for termination */ + int avail = 0; + if (ctxt->input->buf == NULL) + avail = ctxt->input->length - + (ctxt->input->cur - ctxt->input->base); + else + avail = ctxt->input->buf->buffer->use - + (ctxt->input->cur - ctxt->input->base); + if ((ctxt->instate != XML_PARSER_EOF) && (ctxt->instate != XML_PARSER_EPILOG)) { ctxt->errNo = XML_ERR_DOCUMENT_END; @@ -8903,6 +8911,15 @@ xmlParseChunk(xmlParserCtxtPtr ctxt, const char *chunk, int size, ctxt->wellFormed = 0; ctxt->disableSAX = 1; } + if ((ctxt->instate == XML_PARSER_EPILOG) && (avail > 0)) { + ctxt->errNo = XML_ERR_DOCUMENT_END; + if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) + ctxt->sax->error(ctxt->userData, + "Extra content at the end of the document\n"); + ctxt->wellFormed = 0; + ctxt->disableSAX = 1; + + } if (ctxt->instate != XML_PARSER_EOF) { if ((ctxt->sax) && (ctxt->sax->endDocument != NULL)) ctxt->sax->endDocument(ctxt->userData); diff --git a/xmlIO.c b/xmlIO.c index 796c8ac0..0972e3fa 100644 --- a/xmlIO.c +++ b/xmlIO.c @@ -261,25 +261,22 @@ xmlCleanupOutputCallbacks(void) * returns 1. if stat fails, returns 0 (if calling * stat on the filename fails, it can't be right). * if stat succeeds and the file is a directory, - * sets errno to EISDIR and returns 0. otherwise - * returns 1. + * returns 2. otherwise returns 1. */ -static int +int xmlCheckFilename (const char *path) { #ifdef HAVE_STAT -#ifdef S_ISDIR struct stat stat_buffer; if (stat(path, &stat_buffer) == -1) return 0; +#ifdef S_ISDIR if (S_ISDIR(stat_buffer.st_mode)) { - errno = EISDIR; - return 0; + return 2; } - #endif #endif return 1; @@ -992,7 +989,7 @@ static void xmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt ) { if ( ctxt->uri != NULL ) - free( ctxt->uri ); + xmlFree( ctxt->uri ); if ( ctxt->doc_buff != NULL ) { @@ -1007,7 +1004,7 @@ xmlFreeHTTPWriteCtxt( xmlIOHTTPWriteCtxtPtr ctxt ) } } - free( ctxt ); + xmlFree( ctxt ); return; }