Подробности
[В начало]
Проблема в реализации № S0752
Краткое описание
Некоторые функции из libxml2 выдают сообщение о пустом документе на любых входных данных
Подробное описание
Функции xmlCtxtReadIO, xmlReadIO, htmlCtxtReadIO, htmlReadIO выдают сообщение "Пустой документ" на любых входных данных.
Раздел стандарта
http://xmlsoft.org/html/libxml-parser.html#xmlCtxtReadIO
Пример
#include <libxml2/libxml/parser.h>
#include <libxml2/libxml/parserInternals.h>
int xmlInputReadCallback_Function (void * context, char * buffer, int length ) {
return 0;
}
int xmlInputCloseCallback_Function(void * context) {
return 0;
}
int main()
{
xmlCtxtReadIO(
xmlCreateFileParserCtxt("test.xml"), // this can be any xml file
&xmlInputReadCallback_Function,
&xmlInputCloseCallback_Function,
NULL,
"test.xml",
NULL,
0
);
return 0;
}
Способы устранения
Причину ошибки можно понять, проанализировав исходный код.
Сообщение выдается в следующей строке:
parse.c:10008:
if (CUR == 0) {
xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL);
}
При этом CUR - это макрос равный *ctxt->input->cur.Путь создания и инициализации переменной ctxt следующий:
xmlBufferCreateSize()
{
...
tree.c:6687: ret->content[0] = 0;
...
return ret
}
xmlAllocParserInputBuffer{
...
xmlIO.c:2236: ret->buffer = xmlBufferCreateSize(). // *ret->buffer->content = 0;
...
return ret
}
xmlParserInputBufferCreateIO {
...
xmlIO.c:2900: ret = xmlAllocParserInputBuffer(enc); // *ret->buffer->content = 0;
...
return ret;
}
xmlCtxtReadIO {
...
parser.c:14608: input = xmlParserInputBufferCreateIO() // *input->buffer->content = 0;
...
parser.c:14612: stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE);
}
xmlNewIOInputStream {
...
parserInternals.c:1338: inputStream->buf = input; // *inputStream->buf->buffer->content = 0;
parserInternals.c:1340: inputStream->cur = inputStream->buf->buffer->content; // *inputStream->cur = 0;
...
return inputStream;
}
xmlCtxtReadIO {
...
parser.c:14612: stream = xmlNewIOInputStream(ctxt, input, XML_CHAR_ENCODING_NONE); // *stream->cur = 0;
inputPush(ctxt, stream);
}
inputPush(ctxt, value) { // value = stream
...
parser.c:1495: ctxt->input = value; // *ctxt->input->cur = 0;
...
}
xmlCtxtReadIO {
...
inputPush(ctxt, stream);
parser.c:14618: return (xmlDoRead(ctxt, URL, encoding, options, 1));
}
xmlDoRead() {
...
parse.c:10008:
if (CUR == 0) { // CUR = *ctxt->input->cur = 0;
xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL);
}
}
Получается, что исходные данные никак не повлияли на значение поля *ctxt->input->cur. И в любом случае выдается сообщение об ошибке.Для функций htmlCtxtReadIO, xmlReadIO, htmlReadIO ситуация аналогичная.
Компонент
libxml2 2.6.16 and later
[В начало]
»