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