Commit 819d5cb8 authored by Daniel Veillard's avatar Daniel Veillard

Christian Glahn found a small bug in the push parser. cleaned up and made

* parser.c: Christian Glahn found a small bug in the push parser.
* xmlIO.c include/libxml/xmlIO.h: cleaned up and made xmlCheckFilename
  public
Daniel
parent 6045c90a
Mon Oct 14 13:12:55 CEST 2002 Daniel Veillard <daniel@veillard.com>
* 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 <daniel@veillard.com>
* xmlschemas.c include/libxml/xmlschemas.h: added
......
......@@ -254,6 +254,7 @@ xmlParserInputPtr xmlNoNetExternalEntityLoader(const char *URL,
xmlChar *xmlNormalizeWindowsPath (const xmlChar *path);
int xmlCheckFilename (const char *path);
/**
* Default 'file://' protocol callbacks
*/
......
......@@ -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);
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment