File libxml2-CVE-2025-9714-7.patch of Package libxml2.41582
From 429d4ecaae5d61d591f279220125a583836fb84e Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <wellnhofer@aevum.de>
Date: Sun, 20 Oct 2019 14:22:20 +0200
Subject: [PATCH] Propagate memory errors in valuePush
Currently, many memory allocation errors in xpath.c aren't propagated to
the parser/evaluation context and for the most part ignored. Most
XPath objects allocated via one of the New, Wrap or Copy functions end
up being pushed on the stack, so adding a check in valuePush handles
many cases without much effort.
Also simplify the code a little and make sure to return -1 in case of
error.
---
xpath.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
Index: libxml2-2.9.7/xpath.c
===================================================================
--- libxml2-2.9.7.orig/xpath.c
+++ libxml2-2.9.7/xpath.c
@@ -2907,29 +2907,36 @@ valuePop(xmlXPathParserContextPtr ctxt)
* @ctxt: an XPath evaluation context
* @value: the XPath object
*
- * Pushes a new XPath object on top of the value stack
+ * Pushes a new XPath object on top of the value stack. If value is NULL,
+ * a memory error is recorded in the parser context.
*
- * returns the number of items on the value stack
+ * Returns the number of items on the value stack, or -1 in case of error.
*/
int
valuePush(xmlXPathParserContextPtr ctxt, xmlXPathObjectPtr value)
{
- if ((ctxt == NULL) || (value == NULL)) return(-1);
+ if (ctxt == NULL) return(-1);
+ if (value == NULL) {
+ /*
+ * A NULL value typically indicates that a memory allocation failed,
+ * so we set ctxt->error here to propagate the error.
+ */
+ ctxt->error = XPATH_MEMORY_ERROR;
+ return(-1);
+ }
if (ctxt->valueNr >= ctxt->valueMax) {
xmlXPathObjectPtr *tmp;
if (ctxt->valueMax >= XPATH_MAX_STACK_DEPTH) {
- xmlXPathErrMemory(NULL, "XPath stack depth limit reached\n");
- ctxt->error = XPATH_MEMORY_ERROR;
- return (0);
+ xmlXPathPErrMemory(ctxt, "XPath stack depth limit reached\n");
+ return (-1);
}
tmp = (xmlXPathObjectPtr *) xmlRealloc(ctxt->valueTab,
2 * ctxt->valueMax *
sizeof(ctxt->valueTab[0]));
if (tmp == NULL) {
- xmlXPathErrMemory(NULL, "pushing value\n");
- ctxt->error = XPATH_MEMORY_ERROR;
- return (0);
+ xmlXPathPErrMemory(ctxt, "pushing value\n");
+ return (-1);
}
ctxt->valueMax *= 2;
ctxt->valueTab = tmp;