153aa9179Sopenharmony_ciFrom 19b197b61646fd2ad7e584b739500876681c4e3d Mon Sep 17 00:00:00 2001
253aa9179Sopenharmony_ciFrom: Nick Wellnhofer <wellnhofer@aevum.de>
353aa9179Sopenharmony_ciDate: Sun, 5 Mar 2023 14:10:56 +0100
453aa9179Sopenharmony_ciSubject: [PATCH] malloc-fail: Fix null deref after xmlSchemaCompareDates
553aa9179Sopenharmony_ci
653aa9179Sopenharmony_ciFound with libFuzzer, see #344.
753aa9179Sopenharmony_ci
853aa9179Sopenharmony_ciReference:https://github.com/GNOME/libxml2/commit/19b197b61646fd2ad7e584b739500876681c4e3d
953aa9179Sopenharmony_ciConflict:NA
1053aa9179Sopenharmony_ci---
1153aa9179Sopenharmony_ci xmlschemastypes.c | 28 ++++++++++++++++++++++++++++
1253aa9179Sopenharmony_ci 1 file changed, 28 insertions(+)
1353aa9179Sopenharmony_ci
1453aa9179Sopenharmony_cidiff --git a/xmlschemastypes.c b/xmlschemastypes.c
1553aa9179Sopenharmony_ciindex 160777f..d5c7790 100644
1653aa9179Sopenharmony_ci--- a/xmlschemastypes.c
1753aa9179Sopenharmony_ci+++ b/xmlschemastypes.c
1853aa9179Sopenharmony_ci@@ -4146,9 +4146,15 @@ xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
1953aa9179Sopenharmony_ci 
2053aa9179Sopenharmony_ci         if (!y->value.date.tz_flag) {
2153aa9179Sopenharmony_ci             p1 = xmlSchemaDateNormalize(x, 0);
2253aa9179Sopenharmony_ci+            if (p1 == NULL)
2353aa9179Sopenharmony_ci+                return -2;
2453aa9179Sopenharmony_ci             p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
2553aa9179Sopenharmony_ci             /* normalize y + 14:00 */
2653aa9179Sopenharmony_ci             q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
2753aa9179Sopenharmony_ci+            if (q1 == NULL) {
2853aa9179Sopenharmony_ci+		xmlSchemaFreeValue(p1);
2953aa9179Sopenharmony_ci+                return -2;
3053aa9179Sopenharmony_ci+            }
3153aa9179Sopenharmony_ci 
3253aa9179Sopenharmony_ci             q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
3353aa9179Sopenharmony_ci             if (p1d < q1d) {
3453aa9179Sopenharmony_ci@@ -4167,6 +4173,11 @@ xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
3553aa9179Sopenharmony_ci 		    int ret = 0;
3653aa9179Sopenharmony_ci                     /* normalize y - 14:00 */
3753aa9179Sopenharmony_ci                     q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
3853aa9179Sopenharmony_ci+                    if (q2 == NULL) {
3953aa9179Sopenharmony_ci+                        xmlSchemaFreeValue(p1);
4053aa9179Sopenharmony_ci+                        xmlSchemaFreeValue(q1);
4153aa9179Sopenharmony_ci+                        return -2;
4253aa9179Sopenharmony_ci+                    }
4353aa9179Sopenharmony_ci                     q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
4453aa9179Sopenharmony_ci                     if (p1d > q2d)
4553aa9179Sopenharmony_ci                         ret = 1;
4653aa9179Sopenharmony_ci@@ -4190,10 +4201,16 @@ xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
4753aa9179Sopenharmony_ci         }
4853aa9179Sopenharmony_ci     } else if (y->value.date.tz_flag) {
4953aa9179Sopenharmony_ci         q1 = xmlSchemaDateNormalize(y, 0);
5053aa9179Sopenharmony_ci+        if (q1 == NULL)
5153aa9179Sopenharmony_ci+            return -2;
5253aa9179Sopenharmony_ci         q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
5353aa9179Sopenharmony_ci 
5453aa9179Sopenharmony_ci         /* normalize x - 14:00 */
5553aa9179Sopenharmony_ci         p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
5653aa9179Sopenharmony_ci+        if (p1 == NULL) {
5753aa9179Sopenharmony_ci+	    xmlSchemaFreeValue(q1);
5853aa9179Sopenharmony_ci+            return -2;
5953aa9179Sopenharmony_ci+        }
6053aa9179Sopenharmony_ci         p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
6153aa9179Sopenharmony_ci 
6253aa9179Sopenharmony_ci         if (p1d < q1d) {
6353aa9179Sopenharmony_ci@@ -4212,6 +4229,11 @@ xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
6453aa9179Sopenharmony_ci 	        int ret = 0;
6553aa9179Sopenharmony_ci                 /* normalize x + 14:00 */
6653aa9179Sopenharmony_ci                 p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
6753aa9179Sopenharmony_ci+                if (p2 == NULL) {
6853aa9179Sopenharmony_ci+                    xmlSchemaFreeValue(p1);
6953aa9179Sopenharmony_ci+                    xmlSchemaFreeValue(q1);
7053aa9179Sopenharmony_ci+                    return -2;
7153aa9179Sopenharmony_ci+                }
7253aa9179Sopenharmony_ci                 p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
7353aa9179Sopenharmony_ci 
7453aa9179Sopenharmony_ci                 if (p2d > q1d) {
7553aa9179Sopenharmony_ci@@ -4241,9 +4263,15 @@ xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
7653aa9179Sopenharmony_ci     if (x->type == y->type) {
7753aa9179Sopenharmony_ci         int ret = 0;
7853aa9179Sopenharmony_ci         q1 = xmlSchemaDateNormalize(y, 0);
7953aa9179Sopenharmony_ci+        if (q1 == NULL)
8053aa9179Sopenharmony_ci+            return -2;
8153aa9179Sopenharmony_ci         q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
8253aa9179Sopenharmony_ci 
8353aa9179Sopenharmony_ci         p1 = xmlSchemaDateNormalize(x, 0);
8453aa9179Sopenharmony_ci+        if (p1 == NULL) {
8553aa9179Sopenharmony_ci+	    xmlSchemaFreeValue(q1);
8653aa9179Sopenharmony_ci+            return -2;
8753aa9179Sopenharmony_ci+        }
8853aa9179Sopenharmony_ci         p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
8953aa9179Sopenharmony_ci 
9053aa9179Sopenharmony_ci         if (p1d < q1d) {
9153aa9179Sopenharmony_ci-- 
9253aa9179Sopenharmony_ci2.27.0
9353aa9179Sopenharmony_ci
94