153aa9179Sopenharmony_ciFrom 1d4f5d24ac3976012ab1f5b811385e7b00caaecf Mon Sep 17 00:00:00 2001
253aa9179Sopenharmony_ciFrom: Nick Wellnhofer <wellnhofer@aevum.de>
353aa9179Sopenharmony_ciDate: Tue, 13 Sep 2022 16:40:31 +0200
453aa9179Sopenharmony_ciSubject: [PATCH] schemas: Fix null-pointer-deref in
553aa9179Sopenharmony_ci xmlSchemaCheckCOSSTDerivedOK
653aa9179Sopenharmony_ci
753aa9179Sopenharmony_ciFound by OSS-Fuzz.
853aa9179Sopenharmony_ci
953aa9179Sopenharmony_ciReference:https://github.com/GNOME/libxml2/commit/1d4f5d24ac3976012ab1f5b811385e7b00caaecf
1053aa9179Sopenharmony_ciConflict:NA
1153aa9179Sopenharmony_ci
1253aa9179Sopenharmony_ci---
1353aa9179Sopenharmony_ci result/schemas/oss-fuzz-51295_0_0.err |  2 ++
1453aa9179Sopenharmony_ci test/schemas/oss-fuzz-51295_0.xml     |  1 +
1553aa9179Sopenharmony_ci test/schemas/oss-fuzz-51295_0.xsd     |  4 ++++
1653aa9179Sopenharmony_ci xmlschemas.c                          | 15 +++++++++++++--
1753aa9179Sopenharmony_ci 4 files changed, 20 insertions(+), 2 deletions(-)
1853aa9179Sopenharmony_ci create mode 100644 result/schemas/oss-fuzz-51295_0_0.err
1953aa9179Sopenharmony_ci create mode 100644 test/schemas/oss-fuzz-51295_0.xml
2053aa9179Sopenharmony_ci create mode 100644 test/schemas/oss-fuzz-51295_0.xsd
2153aa9179Sopenharmony_ci
2253aa9179Sopenharmony_cidiff --git a/result/schemas/oss-fuzz-51295_0_0.err b/result/schemas/oss-fuzz-51295_0_0.err
2353aa9179Sopenharmony_cinew file mode 100644
2453aa9179Sopenharmony_ciindex 00000000..1e89524f
2553aa9179Sopenharmony_ci--- /dev/null
2653aa9179Sopenharmony_ci+++ b/result/schemas/oss-fuzz-51295_0_0.err
2753aa9179Sopenharmony_ci@@ -0,0 +1,2 @@
2853aa9179Sopenharmony_ci+./test/schemas/oss-fuzz-51295_0.xsd:2: element element: Schemas parser error : element decl. 'e': The element declaration 'e' defines a circular substitution group to element declaration 'e'.
2953aa9179Sopenharmony_ci+./test/schemas/oss-fuzz-51295_0.xsd:2: element element: Schemas parser error : element decl. 'e': The element declaration 'e' defines a circular substitution group to element declaration 'e'.
3053aa9179Sopenharmony_cidiff --git a/test/schemas/oss-fuzz-51295_0.xml b/test/schemas/oss-fuzz-51295_0.xml
3153aa9179Sopenharmony_cinew file mode 100644
3253aa9179Sopenharmony_ciindex 00000000..10a7e703
3353aa9179Sopenharmony_ci--- /dev/null
3453aa9179Sopenharmony_ci+++ b/test/schemas/oss-fuzz-51295_0.xml
3553aa9179Sopenharmony_ci@@ -0,0 +1 @@
3653aa9179Sopenharmony_ci+<e/>
3753aa9179Sopenharmony_cidiff --git a/test/schemas/oss-fuzz-51295_0.xsd b/test/schemas/oss-fuzz-51295_0.xsd
3853aa9179Sopenharmony_cinew file mode 100644
3953aa9179Sopenharmony_ciindex 00000000..fde96af5
4053aa9179Sopenharmony_ci--- /dev/null
4153aa9179Sopenharmony_ci+++ b/test/schemas/oss-fuzz-51295_0.xsd
4253aa9179Sopenharmony_ci@@ -0,0 +1,4 @@
4353aa9179Sopenharmony_ci+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
4453aa9179Sopenharmony_ci+    <xs:element name="e" substitutionGroup="e"/>
4553aa9179Sopenharmony_ci+    <xs:element name="t" substitutionGroup="e" type='xs:decimal'/>
4653aa9179Sopenharmony_ci+</xs:schema>
4753aa9179Sopenharmony_cidiff --git a/xmlschemas.c b/xmlschemas.c
4853aa9179Sopenharmony_ciindex ade10f78..de6ea2b0 100644
4953aa9179Sopenharmony_ci--- a/xmlschemas.c
5053aa9179Sopenharmony_ci+++ b/xmlschemas.c
5153aa9179Sopenharmony_ci@@ -13348,8 +13348,19 @@ xmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
5253aa9179Sopenharmony_ci 	    * declaration `resolved` to by the `actual value`
5353aa9179Sopenharmony_ci 	    * of the substitutionGroup [attribute], if present"
5453aa9179Sopenharmony_ci 	    */
5553aa9179Sopenharmony_ci-	    if (elemDecl->subtypes == NULL)
5653aa9179Sopenharmony_ci-		elemDecl->subtypes = substHead->subtypes;
5753aa9179Sopenharmony_ci+	    if (elemDecl->subtypes == NULL) {
5853aa9179Sopenharmony_ci+                if (substHead->subtypes == NULL) {
5953aa9179Sopenharmony_ci+                    /*
6053aa9179Sopenharmony_ci+                     * This can happen with self-referencing substitution
6153aa9179Sopenharmony_ci+                     * groups. The cycle will be detected later, but we have
6253aa9179Sopenharmony_ci+                     * to set subtypes to avoid null-pointer dereferences.
6353aa9179Sopenharmony_ci+                     */
6453aa9179Sopenharmony_ci+	            elemDecl->subtypes = xmlSchemaGetBuiltInType(
6553aa9179Sopenharmony_ci+                            XML_SCHEMAS_ANYTYPE);
6653aa9179Sopenharmony_ci+                } else {
6753aa9179Sopenharmony_ci+		    elemDecl->subtypes = substHead->subtypes;
6853aa9179Sopenharmony_ci+                }
6953aa9179Sopenharmony_ci+            }
7053aa9179Sopenharmony_ci 	}
7153aa9179Sopenharmony_ci     }
7253aa9179Sopenharmony_ci     /*
7353aa9179Sopenharmony_ci-- 
7453aa9179Sopenharmony_ci2.27.0
7553aa9179Sopenharmony_ci
76