153aa9179Sopenharmony_ciFrom ee6c6084e58ab114bddd06453790d22b08e45d93 Mon Sep 17 00:00:00 2001 253aa9179Sopenharmony_ciFrom: Nick Wellnhofer <wellnhofer@aevum.de> 353aa9179Sopenharmony_ciDate: Sun, 13 Nov 2022 16:30:46 +0100 453aa9179Sopenharmony_ciSubject: [PATCH] io: Remove xmlInputReadCallbackNop 553aa9179Sopenharmony_ci 653aa9179Sopenharmony_ciIn some cases, for example when using encoders, the read callback was 753aa9179Sopenharmony_ciset to NULL, in other cases it was set to xmlInputReadCallbackNop. 853aa9179Sopenharmony_cixmlGROW only tested for xmlInputReadCallbackNop, resulting in errors 953aa9179Sopenharmony_ciwhen parsing large encoded content from memory. 1053aa9179Sopenharmony_ci 1153aa9179Sopenharmony_ciAlways use a NULL callback for memory buffers to avoid ambiguities. 1253aa9179Sopenharmony_ci 1353aa9179Sopenharmony_ciFixes #262. 1453aa9179Sopenharmony_ci 1553aa9179Sopenharmony_ciReference:https://github.com/GNOME/libxml2/commit/46cd7d224ed5c4cdbd4f72ec899db24e18d21fe7 1653aa9179Sopenharmony_ciConflict:include/private/io.h 1753aa9179Sopenharmony_ci--- 1853aa9179Sopenharmony_ci parser.c | 2 +- 1953aa9179Sopenharmony_ci parserInternals.c | 3 ++- 2053aa9179Sopenharmony_ci xmlIO.c | 30 ++++-------------------------- 2153aa9179Sopenharmony_ci 3 files changed, 7 insertions(+), 28 deletions(-) 2253aa9179Sopenharmony_ci 2353aa9179Sopenharmony_cidiff --git a/parser.c b/parser.c 2453aa9179Sopenharmony_ciindex adc449c..f13287a 100644 2553aa9179Sopenharmony_ci--- a/parser.c 2653aa9179Sopenharmony_ci+++ b/parser.c 2753aa9179Sopenharmony_ci@@ -2134,7 +2134,7 @@ static void xmlGROW (xmlParserCtxtPtr ctxt) { 2853aa9179Sopenharmony_ci if (((curEnd > XML_MAX_LOOKUP_LIMIT) || 2953aa9179Sopenharmony_ci (curBase > XML_MAX_LOOKUP_LIMIT)) && 3053aa9179Sopenharmony_ci ((ctxt->input->buf) && 3153aa9179Sopenharmony_ci- (ctxt->input->buf->readcallback != xmlInputReadCallbackNop)) && 3253aa9179Sopenharmony_ci+ (ctxt->input->buf->readcallback != NULL)) && 3353aa9179Sopenharmony_ci ((ctxt->options & XML_PARSE_HUGE) == 0)) { 3453aa9179Sopenharmony_ci xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); 3553aa9179Sopenharmony_ci xmlHaltParser(ctxt); 3653aa9179Sopenharmony_cidiff --git a/parserInternals.c b/parserInternals.c 3753aa9179Sopenharmony_ciindex 0ef44fe..ef18ccf 100644 3853aa9179Sopenharmony_ci--- a/parserInternals.c 3953aa9179Sopenharmony_ci+++ b/parserInternals.c 4053aa9179Sopenharmony_ci@@ -311,7 +311,8 @@ xmlParserInputGrow(xmlParserInputPtr in, int len) { 4153aa9179Sopenharmony_ci if (in->buf->buffer == NULL) return(-1); 4253aa9179Sopenharmony_ci 4353aa9179Sopenharmony_ci /* Don't grow memory buffers. */ 4453aa9179Sopenharmony_ci- if (in->buf->readcallback == NULL) return(0); 4553aa9179Sopenharmony_ci+ if ((in->buf->encoder == NULL) && (in->buf->readcallback == NULL)) 4653aa9179Sopenharmony_ci+ return(0); 4753aa9179Sopenharmony_ci 4853aa9179Sopenharmony_ci CHECK_BUFFER(in); 4953aa9179Sopenharmony_ci 5053aa9179Sopenharmony_cidiff --git a/xmlIO.c b/xmlIO.c 5153aa9179Sopenharmony_ciindex 0762034..71c9fbf 100644 5253aa9179Sopenharmony_ci--- a/xmlIO.c 5353aa9179Sopenharmony_ci+++ b/xmlIO.c 5453aa9179Sopenharmony_ci@@ -729,20 +729,6 @@ xmlCheckFilename (const char *path) 5553aa9179Sopenharmony_ci return 1; 5653aa9179Sopenharmony_ci } 5753aa9179Sopenharmony_ci 5853aa9179Sopenharmony_ci-/** 5953aa9179Sopenharmony_ci- * xmlInputReadCallbackNop: 6053aa9179Sopenharmony_ci- * 6153aa9179Sopenharmony_ci- * No Operation xmlInputReadCallback function, does nothing. 6253aa9179Sopenharmony_ci- * 6353aa9179Sopenharmony_ci- * Returns zero 6453aa9179Sopenharmony_ci- */ 6553aa9179Sopenharmony_ci-int 6653aa9179Sopenharmony_ci-xmlInputReadCallbackNop(void *context ATTRIBUTE_UNUSED, 6753aa9179Sopenharmony_ci- char *buffer ATTRIBUTE_UNUSED, 6853aa9179Sopenharmony_ci- int len ATTRIBUTE_UNUSED) { 6953aa9179Sopenharmony_ci- return(0); 7053aa9179Sopenharmony_ci-} 7153aa9179Sopenharmony_ci- 7253aa9179Sopenharmony_ci /** 7353aa9179Sopenharmony_ci * xmlFdRead: 7453aa9179Sopenharmony_ci * @context: the I/O context 7553aa9179Sopenharmony_ci@@ -2963,7 +2949,7 @@ xmlParserInputBufferCreateMem(const char *mem, int size, xmlCharEncoding enc) { 7653aa9179Sopenharmony_ci ret = xmlAllocParserInputBuffer(enc); 7753aa9179Sopenharmony_ci if (ret != NULL) { 7853aa9179Sopenharmony_ci ret->context = (void *) mem; 7953aa9179Sopenharmony_ci- ret->readcallback = xmlInputReadCallbackNop; 8053aa9179Sopenharmony_ci+ ret->readcallback = NULL; 8153aa9179Sopenharmony_ci ret->closecallback = NULL; 8253aa9179Sopenharmony_ci errcode = xmlBufAdd(ret->buffer, (const xmlChar *) mem, size); 8353aa9179Sopenharmony_ci if (errcode != 0) { 8453aa9179Sopenharmony_ci@@ -3261,10 +3247,8 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { 8553aa9179Sopenharmony_ci res = in->readcallback(in->context, &buffer[0], len); 8653aa9179Sopenharmony_ci if (res <= 0) 8753aa9179Sopenharmony_ci in->readcallback = endOfInput; 8853aa9179Sopenharmony_ci- } else { 8953aa9179Sopenharmony_ci- xmlIOErr(XML_IO_NO_INPUT, NULL); 9053aa9179Sopenharmony_ci- in->error = XML_IO_NO_INPUT; 9153aa9179Sopenharmony_ci- return(-1); 9253aa9179Sopenharmony_ci+ } else if (in->encoder == NULL) { 9353aa9179Sopenharmony_ci+ return(0); 9453aa9179Sopenharmony_ci } 9553aa9179Sopenharmony_ci if (res < 0) { 9653aa9179Sopenharmony_ci return(-1); 9753aa9179Sopenharmony_ci@@ -3331,13 +3315,7 @@ xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { 9853aa9179Sopenharmony_ci */ 9953aa9179Sopenharmony_ci int 10053aa9179Sopenharmony_ci xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) { 10153aa9179Sopenharmony_ci- if ((in == NULL) || (in->error)) return(-1); 10253aa9179Sopenharmony_ci- if (in->readcallback != NULL) 10353aa9179Sopenharmony_ci- return(xmlParserInputBufferGrow(in, len)); 10453aa9179Sopenharmony_ci- else if (xmlBufGetAllocationScheme(in->buffer) == XML_BUFFER_ALLOC_IMMUTABLE) 10553aa9179Sopenharmony_ci- return(0); 10653aa9179Sopenharmony_ci- else 10753aa9179Sopenharmony_ci- return(-1); 10853aa9179Sopenharmony_ci+ return(xmlParserInputBufferGrow(in, len)); 10953aa9179Sopenharmony_ci } 11053aa9179Sopenharmony_ci 11153aa9179Sopenharmony_ci #ifdef LIBXML_OUTPUT_ENABLED 11253aa9179Sopenharmony_ci-- 11353aa9179Sopenharmony_ci2.27.0 11453aa9179Sopenharmony_ci 115