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