mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-10-26 00:37:43 +03:00
reader: Fix reading compressed data
Also make sure that functions that don't return error codes set the global error.
This commit is contained in:
40
xmllint.c
40
xmllint.c
@@ -1574,22 +1574,24 @@ static void streamFile(xmllintState *lint, const char *filename) {
|
|||||||
if (lint->memory) {
|
if (lint->memory) {
|
||||||
reader = xmlReaderForMemory(lint->memoryData, lint->memorySize,
|
reader = xmlReaderForMemory(lint->memoryData, lint->memorySize,
|
||||||
filename, NULL, lint->options);
|
filename, NULL, lint->options);
|
||||||
|
if (reader == NULL) {
|
||||||
|
lint->progresult = XMLLINT_ERR_MEM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
xmlResetLastError();
|
||||||
|
|
||||||
if (strcmp(filename, "-") == 0) {
|
if (strcmp(filename, "-") == 0) {
|
||||||
reader = xmlReaderForFd(STDIN_FILENO, "-", NULL, lint->options);
|
reader = xmlReaderForFd(STDIN_FILENO, "-", NULL,
|
||||||
|
lint->options | XML_PARSE_UNZIP);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/*
|
reader = xmlReaderForFile(filename, NULL,
|
||||||
* There's still no easy way to get a reader for a file with
|
lint->options | XML_PARSE_UNZIP);
|
||||||
* adequate error repoting.
|
}
|
||||||
*/
|
if (reader == NULL) {
|
||||||
|
|
||||||
xmlResetLastError();
|
|
||||||
input = xmlParserInputBufferCreateFilename(filename,
|
|
||||||
XML_CHAR_ENCODING_NONE);
|
|
||||||
if (input == NULL) {
|
|
||||||
const xmlError *error = xmlGetLastError();
|
const xmlError *error = xmlGetLastError();
|
||||||
|
|
||||||
if ((error != NULL) && (error->code == XML_ERR_NO_MEMORY)) {
|
if ((error != NULL) && (error->code == XML_ERR_NO_MEMORY)) {
|
||||||
@@ -1600,24 +1602,6 @@ static void streamFile(xmllintState *lint, const char *filename) {
|
|||||||
}
|
}
|
||||||
return;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (reader == NULL) {
|
|
||||||
lint->progresult = XMLLINT_ERR_MEM;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LIBXML_PATTERN_ENABLED
|
#ifdef LIBXML_PATTERN_ENABLED
|
||||||
|
|||||||
145
xmlreader.c
145
xmlreader.c
@@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#include "private/buf.h"
|
#include "private/buf.h"
|
||||||
#include "private/error.h"
|
#include "private/error.h"
|
||||||
|
#include "private/io.h"
|
||||||
#include "private/memory.h"
|
#include "private/memory.h"
|
||||||
#include "private/parser.h"
|
#include "private/parser.h"
|
||||||
#include "private/tree.h"
|
#include "private/tree.h"
|
||||||
@@ -188,6 +189,21 @@ static int xmlTextReaderNextTree(xmlTextReaderPtr reader);
|
|||||||
static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur);
|
static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur);
|
||||||
static void xmlTextReaderFreeNodeList(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
|
static void
|
||||||
xmlTextReaderErrMemory(xmlTextReaderPtr reader) {
|
xmlTextReaderErrMemory(xmlTextReaderPtr reader) {
|
||||||
if (reader->ctxt != NULL)
|
if (reader->ctxt != NULL)
|
||||||
@@ -2114,11 +2130,30 @@ xmlNewTextReaderFilename(const char *URI) {
|
|||||||
xmlParserInputBufferPtr input;
|
xmlParserInputBufferPtr input;
|
||||||
xmlTextReaderPtr ret;
|
xmlTextReaderPtr ret;
|
||||||
|
|
||||||
input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE);
|
if (xmlParserInputBufferCreateFilenameValue != NULL) {
|
||||||
if (input == NULL)
|
input = xmlParserInputBufferCreateFilenameValue(URI,
|
||||||
|
XML_CHAR_ENCODING_NONE);
|
||||||
|
if (input == NULL) {
|
||||||
|
xmlTextReaderErr(XML_IO_ENOENT, "filaed to open %s", URI);
|
||||||
return(NULL);
|
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);
|
ret = xmlNewTextReader(input, URI);
|
||||||
if (ret == NULL) {
|
if (ret == NULL) {
|
||||||
|
xmlTextReaderErrMemory(NULL);
|
||||||
xmlFreeParserInputBuffer(input);
|
xmlFreeParserInputBuffer(input);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
@@ -5232,23 +5267,39 @@ xmlReaderForFd(int fd, const char *URL, const char *encoding, int options)
|
|||||||
{
|
{
|
||||||
xmlTextReaderPtr reader;
|
xmlTextReaderPtr reader;
|
||||||
xmlParserInputBufferPtr input;
|
xmlParserInputBufferPtr input;
|
||||||
|
xmlParserErrors code;
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0) {
|
||||||
return (NULL);
|
xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE);
|
input = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
|
||||||
if (input == NULL)
|
if (input == NULL) {
|
||||||
return (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;
|
input->closecallback = NULL;
|
||||||
|
|
||||||
reader = xmlNewTextReader(input, URL);
|
reader = xmlNewTextReader(input, URL);
|
||||||
if (reader == NULL) {
|
if (reader == NULL) {
|
||||||
|
xmlTextReaderErrMemory(NULL);
|
||||||
xmlFreeParserInputBuffer(input);
|
xmlFreeParserInputBuffer(input);
|
||||||
return (NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
reader->allocs |= XML_TEXTREADER_INPUT;
|
reader->allocs |= XML_TEXTREADER_INPUT;
|
||||||
if (xmlTextReaderSetup(reader, NULL, URL, encoding, options) < 0) {
|
if (xmlTextReaderSetup(reader, NULL, URL, encoding, options) < 0) {
|
||||||
|
xmlTextReaderErrMemory(NULL);
|
||||||
xmlFreeTextReader(reader);
|
xmlFreeTextReader(reader);
|
||||||
return (NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
return (reader);
|
return (reader);
|
||||||
}
|
}
|
||||||
@@ -5392,17 +5443,42 @@ xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename,
|
|||||||
{
|
{
|
||||||
xmlParserInputBufferPtr input;
|
xmlParserInputBufferPtr input;
|
||||||
|
|
||||||
if (filename == NULL)
|
if ((filename == NULL) || (reader == NULL)) {
|
||||||
return (-1);
|
xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument");
|
||||||
if (reader == NULL)
|
return(-1);
|
||||||
return (-1);
|
}
|
||||||
|
|
||||||
input =
|
if (xmlParserInputBufferCreateFilenameValue != NULL) {
|
||||||
xmlParserInputBufferCreateFilename(filename,
|
input = xmlParserInputBufferCreateFilenameValue(filename,
|
||||||
XML_CHAR_ENCODING_NONE);
|
XML_CHAR_ENCODING_NONE);
|
||||||
if (input == NULL)
|
if (input == NULL) {
|
||||||
return (-1);
|
xmlTextReaderErr(XML_IO_ENOENT, "failed to open %s", filename);
|
||||||
return (xmlTextReaderSetup(reader, input, filename, encoding, options));
|
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)
|
const char *URL, const char *encoding, int options)
|
||||||
{
|
{
|
||||||
xmlParserInputBufferPtr input;
|
xmlParserInputBufferPtr input;
|
||||||
|
xmlParserErrors code;
|
||||||
|
|
||||||
if (fd < 0)
|
if ((fd < 0) || (reader == NULL)) {
|
||||||
return (-1);
|
xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument");
|
||||||
if (reader == NULL)
|
return(-1);
|
||||||
return (-1);
|
}
|
||||||
|
|
||||||
input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE);
|
input = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
|
||||||
if (input == NULL)
|
if (input == NULL) {
|
||||||
return (-1);
|
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;
|
input->closecallback = NULL;
|
||||||
return (xmlTextReaderSetup(reader, input, URL, encoding, options));
|
|
||||||
|
if (xmlTextReaderSetup(reader, input, URL, encoding, options) < 0) {
|
||||||
|
xmlTextReaderErrMemory(NULL);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user