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