[glib/glib-2-64: 1/3] gdatetime: Avoid integer overflow creating dates too far in the past




commit 19e242d1d54a0414d17c4e42e25490784f5231c4
Author: Philip Withnall <pwithnall endlessos org>
Date:   Thu Oct 1 11:45:22 2020 +0100

    gdatetime: Avoid integer overflow creating dates too far in the past
    
    oss-fuzz#22758
    
    Signed-off-by: Philip Withnall <pwithnall endlessos org>

 glib/gdatetime.c       | 6 ++++--
 glib/tests/gdatetime.c | 8 +++++++-
 2 files changed, 11 insertions(+), 3 deletions(-)
---
diff --git a/glib/gdatetime.c b/glib/gdatetime.c
index f93d7d88c..a14124d7c 100644
--- a/glib/gdatetime.c
+++ b/glib/gdatetime.c
@@ -1032,7 +1032,8 @@ g_date_time_new_from_unix_local (gint64 t)
   GDateTime *datetime;
   GTimeZone *local;
 
-  if (t > G_MAXINT64 / USEC_PER_SECOND)
+  if (t > G_MAXINT64 / USEC_PER_SECOND ||
+      t < G_MININT64 / USEC_PER_SECOND)
     return NULL;
 
   local = g_time_zone_new_local ();
@@ -1067,7 +1068,8 @@ g_date_time_new_from_unix_utc (gint64 t)
   GDateTime *datetime;
   GTimeZone *utc;
 
-  if (t > G_MAXINT64 / USEC_PER_SECOND)
+  if (t > G_MAXINT64 / USEC_PER_SECOND ||
+      t < G_MININT64 / USEC_PER_SECOND)
     return NULL;
 
   utc = g_time_zone_new_utc ();
diff --git a/glib/tests/gdatetime.c b/glib/tests/gdatetime.c
index c88b411ff..a09ce710b 100644
--- a/glib/tests/gdatetime.c
+++ b/glib/tests/gdatetime.c
@@ -152,7 +152,7 @@ test_GDateTime_new_from_unix (void)
   g_date_time_unref (dt);
 }
 
-/* Check that trying to create a #GDateTime too far in the future reliably
+/* Check that trying to create a #GDateTime too far in the future (or past) reliably
  * fails. Previously, the checks for this overflowed and it silently returned
  * an incorrect #GDateTime. */
 static void
@@ -167,6 +167,12 @@ test_GDateTime_new_from_unix_overflow (void)
 
   dt = g_date_time_new_from_unix_local (G_MAXINT64);
   g_assert_null (dt);
+
+  dt = g_date_time_new_from_unix_utc (G_MININT64);
+  g_assert_null (dt);
+
+  dt = g_date_time_new_from_unix_local (G_MININT64);
+  g_assert_null (dt);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]