153aa9179Sopenharmony_ciFrom 6f9604f0e3e52e96881ab3b662f35fbe04cd49ac Mon Sep 17 00:00:00 2001
253aa9179Sopenharmony_ciFrom: Nick Wellnhofer <wellnhofer@aevum.de>
353aa9179Sopenharmony_ciDate: Sun, 26 Feb 2023 16:09:50 +0100
453aa9179Sopenharmony_ciSubject: [PATCH] malloc-fail: Fix memory leak in xmlXPathCacheNewNodeSet
553aa9179Sopenharmony_ci
653aa9179Sopenharmony_ciFound with libFuzzer, see #344.
753aa9179Sopenharmony_ci
853aa9179Sopenharmony_ciReference:https://github.com/GNOME/libxml2/commit/6f9604f0e3e52e96881ab3b662f35fbe04cd49ac
953aa9179Sopenharmony_ciConflict:NA
1053aa9179Sopenharmony_ci---
1153aa9179Sopenharmony_ci xpath.c | 15 +++++++++------
1253aa9179Sopenharmony_ci 1 file changed, 9 insertions(+), 6 deletions(-)
1353aa9179Sopenharmony_ci
1453aa9179Sopenharmony_cidiff --git a/xpath.c b/xpath.c
1553aa9179Sopenharmony_ciindex 84b139d..1f358e3 100644
1653aa9179Sopenharmony_ci--- a/xpath.c
1753aa9179Sopenharmony_ci+++ b/xpath.c
1853aa9179Sopenharmony_ci@@ -2448,21 +2448,24 @@ xmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val)
1953aa9179Sopenharmony_ci 	    (cache->miscObjs->number != 0))
2053aa9179Sopenharmony_ci 	{
2153aa9179Sopenharmony_ci 	    xmlXPathObjectPtr ret;
2253aa9179Sopenharmony_ci+            xmlNodeSetPtr set;
2353aa9179Sopenharmony_ci 	    /*
2453aa9179Sopenharmony_ci 	    * Fallback to misc-cache.
2553aa9179Sopenharmony_ci 	    */
2653aa9179Sopenharmony_ci 
2753aa9179Sopenharmony_ci+	    set = xmlXPathNodeSetCreate(val);
2853aa9179Sopenharmony_ci+	    if (set == NULL) {
2953aa9179Sopenharmony_ci+		ctxt->lastError.domain = XML_FROM_XPATH;
3053aa9179Sopenharmony_ci+		ctxt->lastError.code = XML_ERR_NO_MEMORY;
3153aa9179Sopenharmony_ci+		return(NULL);
3253aa9179Sopenharmony_ci+	    }
3353aa9179Sopenharmony_ci+
3453aa9179Sopenharmony_ci 	    ret = (xmlXPathObjectPtr)
3553aa9179Sopenharmony_ci 		cache->miscObjs->items[--cache->miscObjs->number];
3653aa9179Sopenharmony_ci 
3753aa9179Sopenharmony_ci 	    ret->type = XPATH_NODESET;
3853aa9179Sopenharmony_ci 	    ret->boolval = 0;
3953aa9179Sopenharmony_ci-	    ret->nodesetval = xmlXPathNodeSetCreate(val);
4053aa9179Sopenharmony_ci-	    if (ret->nodesetval == NULL) {
4153aa9179Sopenharmony_ci-		ctxt->lastError.domain = XML_FROM_XPATH;
4253aa9179Sopenharmony_ci-		ctxt->lastError.code = XML_ERR_NO_MEMORY;
4353aa9179Sopenharmony_ci-		return(NULL);
4453aa9179Sopenharmony_ci-	    }
4553aa9179Sopenharmony_ci+	    ret->nodesetval = set;
4653aa9179Sopenharmony_ci #ifdef XP_DEBUG_OBJ_USAGE
4753aa9179Sopenharmony_ci 	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
4853aa9179Sopenharmony_ci #endif
4953aa9179Sopenharmony_ci-- 
5053aa9179Sopenharmony_ci2.27.0
5153aa9179Sopenharmony_ci
52