diff --git a/xmllint.c b/xmllint.c index 80ddc4a3..312a4fd0 100644 --- a/xmllint.c +++ b/xmllint.c @@ -1574,50 +1574,34 @@ static void streamFile(xmllintState *lint, const char *filename) { if (lint->memory) { reader = xmlReaderForMemory(lint->memoryData, lint->memorySize, filename, NULL, lint->options); + if (reader == NULL) { + lint->progresult = XMLLINT_ERR_MEM; + return; + } } else #endif { + xmlResetLastError(); + if (strcmp(filename, "-") == 0) { - reader = xmlReaderForFd(STDIN_FILENO, "-", NULL, lint->options); + reader = xmlReaderForFd(STDIN_FILENO, "-", NULL, + lint->options | XML_PARSE_UNZIP); } else { - /* - * There's still no easy way to get a reader for a file with - * adequate error repoting. - */ - - xmlResetLastError(); - input = xmlParserInputBufferCreateFilename(filename, - XML_CHAR_ENCODING_NONE); - if (input == NULL) { - const xmlError *error = xmlGetLastError(); - - if ((error != NULL) && (error->code == XML_ERR_NO_MEMORY)) { - lint->progresult = XMLLINT_ERR_MEM; - } else { - fprintf(errStream, "Unable to open %s\n", filename); - lint->progresult = XMLLINT_ERR_RDFILE; - } - return; - } - - reader = xmlNewTextReader(input, filename); - if (reader == NULL) { - lint->progresult = XMLLINT_ERR_MEM; - xmlFreeParserInputBuffer(input); - return; - } - if (xmlTextReaderSetup(reader, NULL, NULL, NULL, - lint->options) < 0) { - lint->progresult = XMLLINT_ERR_MEM; - xmlFreeParserInputBuffer(input); - return; - } + reader = xmlReaderForFile(filename, NULL, + lint->options | XML_PARSE_UNZIP); + } + if (reader == NULL) { + const xmlError *error = xmlGetLastError(); + + if ((error != NULL) && (error->code == XML_ERR_NO_MEMORY)) { + lint->progresult = XMLLINT_ERR_MEM; + } else { + fprintf(errStream, "Unable to open %s\n", filename); + lint->progresult = XMLLINT_ERR_RDFILE; + } + return; } - } - if (reader == NULL) { - lint->progresult = XMLLINT_ERR_MEM; - return; } #ifdef LIBXML_PATTERN_ENABLED diff --git a/xmlreader.c b/xmlreader.c index 58c68855..12d729e7 100644 --- a/xmlreader.c +++ b/xmlreader.c @@ -43,6 +43,7 @@ #include "private/buf.h" #include "private/error.h" +#include "private/io.h" #include "private/memory.h" #include "private/parser.h" #include "private/tree.h" @@ -188,6 +189,21 @@ static int xmlTextReaderNextTree(xmlTextReaderPtr reader); static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur); static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur); +static void +xmlTextReaderErr(xmlParserErrors code, const char *msg, ...) { + va_list ap; + int res; + + va_start(ap, msg); + res = xmlVRaiseError(NULL, NULL, NULL, NULL, NULL, + XML_FROM_PARSER, code, XML_ERR_FATAL, + NULL, 0, NULL, NULL, NULL, 0, 0, + msg, ap); + va_end(ap); + if (res < 0) + xmlRaiseMemoryError(NULL, NULL, NULL, XML_FROM_PARSER, NULL); +} + static void xmlTextReaderErrMemory(xmlTextReaderPtr reader) { if (reader->ctxt != NULL) @@ -2114,11 +2130,30 @@ xmlNewTextReaderFilename(const char *URI) { xmlParserInputBufferPtr input; xmlTextReaderPtr ret; - input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return(NULL); + if (xmlParserInputBufferCreateFilenameValue != NULL) { + input = xmlParserInputBufferCreateFilenameValue(URI, + XML_CHAR_ENCODING_NONE); + if (input == NULL) { + xmlTextReaderErr(XML_IO_ENOENT, "filaed to open %s", URI); + return(NULL); + } + } else { + xmlParserErrors code; + + /* + * TODO: Remove XML_INPUT_UNZIP + */ + code = xmlParserInputBufferCreateUrl(URI, XML_CHAR_ENCODING_NONE, + XML_INPUT_UNZIP, &input); + if (code != XML_ERR_OK) { + xmlTextReaderErr(code, "failed to open %s", URI); + return(NULL); + } + } + ret = xmlNewTextReader(input, URI); if (ret == NULL) { + xmlTextReaderErrMemory(NULL); xmlFreeParserInputBuffer(input); return(NULL); } @@ -5232,23 +5267,39 @@ xmlReaderForFd(int fd, const char *URL, const char *encoding, int options) { xmlTextReaderPtr reader; xmlParserInputBufferPtr input; + xmlParserErrors code; - if (fd < 0) - return (NULL); + if (fd < 0) { + xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument"); + return(NULL); + } - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (NULL); + input = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); + if (input == NULL) { + xmlTextReaderErrMemory(NULL); + return(NULL); + } + /* + * TODO: Remove XML_INPUT_UNZIP + */ + code = xmlInputFromFd(input, fd, XML_INPUT_UNZIP); + if (code != XML_ERR_OK) { + xmlTextReaderErr(code, "failed to open fd"); + return(NULL); + } input->closecallback = NULL; + reader = xmlNewTextReader(input, URL); if (reader == NULL) { + xmlTextReaderErrMemory(NULL); xmlFreeParserInputBuffer(input); - return (NULL); + return(NULL); } reader->allocs |= XML_TEXTREADER_INPUT; if (xmlTextReaderSetup(reader, NULL, URL, encoding, options) < 0) { + xmlTextReaderErrMemory(NULL); xmlFreeTextReader(reader); - return (NULL); + return(NULL); } return (reader); } @@ -5392,17 +5443,42 @@ xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename, { xmlParserInputBufferPtr input; - if (filename == NULL) - return (-1); - if (reader == NULL) - return (-1); + if ((filename == NULL) || (reader == NULL)) { + xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument"); + return(-1); + } - input = - xmlParserInputBufferCreateFilename(filename, - XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (-1); - return (xmlTextReaderSetup(reader, input, filename, encoding, options)); + if (xmlParserInputBufferCreateFilenameValue != NULL) { + input = xmlParserInputBufferCreateFilenameValue(filename, + XML_CHAR_ENCODING_NONE); + if (input == NULL) { + xmlTextReaderErr(XML_IO_ENOENT, "failed to open %s", filename); + return(-1); + } + } else { + /* + * TODO: Remove XML_INPUT_UNZIP + */ + xmlParserInputFlags flags = XML_INPUT_UNZIP; + xmlParserErrors code; + + if ((options & XML_PARSE_NONET) == 0) + flags |= XML_INPUT_NETWORK; + + code = xmlParserInputBufferCreateUrl(filename, XML_CHAR_ENCODING_NONE, + flags, &input); + if (code != XML_ERR_OK) { + xmlTextReaderErr(code, "failed to open %s", filename); + return(-1); + } + } + + if (xmlTextReaderSetup(reader, input, filename, encoding, options) < 0) { + xmlTextReaderErrMemory(NULL); + return(-1); + } + + return(0); } /** @@ -5460,17 +5536,34 @@ xmlReaderNewFd(xmlTextReaderPtr reader, int fd, const char *URL, const char *encoding, int options) { xmlParserInputBufferPtr input; + xmlParserErrors code; - if (fd < 0) - return (-1); - if (reader == NULL) - return (-1); + if ((fd < 0) || (reader == NULL)) { + xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument"); + return(-1); + } - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); - if (input == NULL) - return (-1); + input = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); + if (input == NULL) { + xmlTextReaderErrMemory(NULL); + return(-1); + } + /* + * TODO: Remove XML_INPUT_UNZIP + */ + code = xmlInputFromFd(input, fd, XML_INPUT_UNZIP); + if (code != XML_ERR_OK) { + xmlTextReaderErr(code, "failed to open fd"); + return(-1); + } input->closecallback = NULL; - return (xmlTextReaderSetup(reader, input, URL, encoding, options)); + + if (xmlTextReaderSetup(reader, input, URL, encoding, options) < 0) { + xmlTextReaderErrMemory(NULL); + return(-1); + } + + return(0); } /**