From 74c95ec5932c737d4fcb06b8646b0017364ada14 Mon Sep 17 00:00:00 2001
From: Mike Dalessio <mike.dalessio@gmail.com>
Date: Fri, 24 Dec 2021 19:08:01 -0500
Subject: [PATCH] attempt to hack in wildcard namespaces to xpath

I'm not confident this is a bulletproof patch.
---
 xpath.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/xpath.c b/xpath.c
index 1aa2f1a..c7f0885 100644
--- a/xpath.c
+++ b/xpath.c
@@ -146,6 +146,9 @@
 #define XPATH_MAX_RECURSION_DEPTH 5000
 #endif
 
+#define WILDCARD_PREFIX "*"
+#define IS_WILDCARD_PREFIX(p) xmlStrEqual((xmlChar*)WILDCARD_PREFIX, p)
+
 /*
  * TODO:
  * There are a few spots where some tests are done which depend upon ascii
@@ -11073,12 +11076,15 @@ xmlXPathCompNodeTest(xmlXPathParserContextPtr ctxt, xmlXPathTestVal *test,
     SKIP_BLANKS;
 
     if ((name == NULL) && (CUR == '*')) {
-	/*
-	 * All elements
-	 */
 	NEXT;
-	*test = NODE_TEST_ALL;
-	return(NULL);
+	if (CUR != ':') {
+	    /*
+	     * All elements
+	     */
+	    *test = NODE_TEST_ALL;
+	    return(NULL);
+	}
+	name = xmlCharStrdup(WILDCARD_PREFIX);
     }
 
     if (name == NULL)
@@ -11327,6 +11333,10 @@ xmlXPathCompStep(xmlXPathParserContextPtr ctxt) {
 	}
 #endif
 	if (CUR == '*') {
+	    if (NXT(1) == ':') {
+		NEXT;
+		name = xmlCharStrdup(WILDCARD_PREFIX);
+	    }
 	    axis = AXIS_CHILD;
 	} else {
 	    if (name == NULL)
@@ -12030,7 +12040,7 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
     /*
     * Setup namespaces.
     */
-    if (prefix != NULL) {
+    if (prefix != NULL && !IS_WILDCARD_PREFIX(prefix)) {
         URI = xmlXPathNsLookup(xpctxt, prefix);
         if (URI == NULL) {
 	    xmlXPathReleaseObject(xpctxt, obj);
@@ -12369,6 +12379,8 @@ xmlXPathNodeCollectAndTest(xmlXPathParserContextPtr ctxt,
 				    {
 					XP_TEST_HIT
                                     }
+                                } else if (IS_WILDCARD_PREFIX(prefix)) {
+                                    XP_TEST_HIT
                                 } else {
                                     if ((cur->ns != NULL) &&
                                         (xmlStrEqual(URI, cur->ns->href)))
-- 
2.31.0

