xzyang / rpms / libxml2

Forked from rpms/libxml2 3 years ago
Clone
1b2bf5
From e8c9cd5c7a0d2ea95edf08b13af3baabce62dd63 Mon Sep 17 00:00:00 2001
1b2bf5
From: Nick Wellnhofer <wellnhofer@aevum.de>
1b2bf5
Date: Mon, 16 Sep 2019 15:36:02 +0200
1b2bf5
Subject: [PATCH] Fix Schema determinism check of ##other namespaces
1b2bf5
1b2bf5
Non-compound (##local) and compound string atoms are always disjoint
1b2bf5
regardless of whether the compound atom is negated (##other).
1b2bf5
1b2bf5
Closes #40.
1b2bf5
---
1b2bf5
 result/schemas/issue40_0_0     |  1 +
1b2bf5
 result/schemas/issue40_0_0.err |  0
1b2bf5
 test/schemas/issue40_0.xml     |  3 +++
1b2bf5
 test/schemas/issue40_0.xsd     | 10 ++++++++++
1b2bf5
 xmlregexp.c                    | 15 ++++++++++++---
1b2bf5
 5 files changed, 26 insertions(+), 3 deletions(-)
1b2bf5
 create mode 100644 result/schemas/issue40_0_0
1b2bf5
 create mode 100644 result/schemas/issue40_0_0.err
1b2bf5
 create mode 100644 test/schemas/issue40_0.xml
1b2bf5
 create mode 100644 test/schemas/issue40_0.xsd
1b2bf5
1b2bf5
diff --git a/result/schemas/issue40_0_0 b/result/schemas/issue40_0_0
1b2bf5
new file mode 100644
1b2bf5
index 00000000..73c9e696
1b2bf5
--- /dev/null
1b2bf5
+++ b/result/schemas/issue40_0_0
1b2bf5
@@ -0,0 +1 @@
1b2bf5
+./test/schemas/issue40_0.xml validates
1b2bf5
diff --git a/result/schemas/issue40_0_0.err b/result/schemas/issue40_0_0.err
1b2bf5
new file mode 100644
1b2bf5
index 00000000..e69de29b
1b2bf5
diff --git a/test/schemas/issue40_0.xml b/test/schemas/issue40_0.xml
1b2bf5
new file mode 100644
1b2bf5
index 00000000..86cff1d0
1b2bf5
--- /dev/null
1b2bf5
+++ b/test/schemas/issue40_0.xml
1b2bf5
@@ -0,0 +1,3 @@
1b2bf5
+<a:aaa xmlns:a="aaa_ns">
1b2bf5
+  <x/>
1b2bf5
+</a:aaa>
1b2bf5
diff --git a/test/schemas/issue40_0.xsd b/test/schemas/issue40_0.xsd
1b2bf5
new file mode 100644
1b2bf5
index 00000000..a7eff55b
1b2bf5
--- /dev/null
1b2bf5
+++ b/test/schemas/issue40_0.xsd
1b2bf5
@@ -0,0 +1,10 @@
1b2bf5
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="aaa_ns" xmlns="http://www.w3.org/1999/XSL/Transform">
1b2bf5
+	<xsd:element name="aaa">
1b2bf5
+		<xsd:complexType>
1b2bf5
+			<xsd:choice>
1b2bf5
+				<xsd:any namespace="##other" processContents="skip" />
1b2bf5
+				<xsd:any namespace="##local" processContents="skip" />
1b2bf5
+			</xsd:choice>
1b2bf5
+		</xsd:complexType>
1b2bf5
+	</xsd:element>
1b2bf5
+</xsd:schema>
1b2bf5
diff --git a/xmlregexp.c b/xmlregexp.c
1b2bf5
index 1e8bf934..10969177 100644
1b2bf5
--- a/xmlregexp.c
1b2bf5
+++ b/xmlregexp.c
1b2bf5
@@ -2528,9 +2528,18 @@ xmlFACompareAtoms(xmlRegAtomPtr atom1, xmlRegAtomPtr atom2, int deep) {
1b2bf5
         case XML_REGEXP_STRING:
1b2bf5
             if (!deep)
1b2bf5
                 ret = (atom1->valuep != atom2->valuep);
1b2bf5
-            else
1b2bf5
-                ret = xmlRegStrEqualWildcard((xmlChar *)atom1->valuep,
1b2bf5
-                                             (xmlChar *)atom2->valuep);
1b2bf5
+            else {
1b2bf5
+                xmlChar *val1 = (xmlChar *)atom1->valuep;
1b2bf5
+                xmlChar *val2 = (xmlChar *)atom2->valuep;
1b2bf5
+                int compound1 = (xmlStrchr(val1, '|') != NULL);
1b2bf5
+                int compound2 = (xmlStrchr(val2, '|') != NULL);
1b2bf5
+
1b2bf5
+                /* Ignore negative match flag for ##other namespaces */
1b2bf5
+                if (compound1 != compound2)
1b2bf5
+                    return(0);
1b2bf5
+
1b2bf5
+                ret = xmlRegStrEqualWildcard(val1, val2);
1b2bf5
+            }
1b2bf5
 	    break;
1b2bf5
         case XML_REGEXP_EPSILON:
1b2bf5
 	    goto not_determinist;
1b2bf5
-- 
1b2bf5
2.24.2
1b2bf5