From b5163c839123fc52b184c4d298f1cadda7f16a0f Mon Sep 17 00:00:00 2001 From: gc-taifu Date: Sun, 27 Apr 2025 16:43:57 +0800 Subject: [PATCH] [CVE] Fix CVE-2025-3360 to #bug20216 Fix CVE-2025-3360 Project: TC2024080204 Signed-off-by: Chang Gao --- ...-Backport-patch-to-fix-CVE-2025-3360.patch | 163 ++++++++++++++++++ glib2.spec | 8 +- 2 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 1001-Backport-patch-to-fix-CVE-2025-3360.patch diff --git a/1001-Backport-patch-to-fix-CVE-2025-3360.patch b/1001-Backport-patch-to-fix-CVE-2025-3360.patch new file mode 100644 index 0000000..1af219b --- /dev/null +++ b/1001-Backport-patch-to-fix-CVE-2025-3360.patch @@ -0,0 +1,163 @@ +From 8b1fe631f5b87bcc7ba09dcd2cec062236d6fce3 Mon Sep 17 00:00:00 2001 +From: gc-taifu +Date: Sun, 27 Apr 2025 16:41:26 +0800 +Subject: [PATCH] Backport patch to fix CVE-2025-3360 + +--- + glib/gdatetime.c | 51 +++++++++++++++++++++++++----------------- + glib/tests/gdatetime.c | 17 ++++++++++++++ + 2 files changed, 47 insertions(+), 21 deletions(-) + +diff --git a/glib/gdatetime.c b/glib/gdatetime.c +index 2640e3b..698715d 100644 +--- a/glib/gdatetime.c ++++ b/glib/gdatetime.c +@@ -1346,12 +1346,16 @@ parse_iso8601_date (const gchar *text, gsize length, + return FALSE; + } + ++/* Value returned in tz_offset is valid if and only if the function return value ++ * is non-NULL. */ + static GTimeZone * +-parse_iso8601_timezone (const gchar *text, gsize length, gssize *tz_offset) ++parse_iso8601_timezone (const gchar *text, gsize length, size_t *tz_offset) + { +- gint i, tz_length, offset_hours, offset_minutes; ++ size_t tz_length; ++ gint offset_hours, offset_minutes; + gint offset_sign = 1; + GTimeZone *tz; ++ const char *tz_start; + + /* UTC uses Z suffix */ + if (length > 0 && text[length - 1] == 'Z') +@@ -1361,42 +1365,42 @@ parse_iso8601_timezone (const gchar *text, gsize length, gssize *tz_offset) + } + + /* Look for '+' or '-' of offset */ +- for (i = length - 1; i >= 0; i--) +- if (text[i] == '+' || text[i] == '-') ++ for (tz_length = 1; tz_length <= length; tz_length++) ++ if (text[length - tz_length] == '+' || text[length - tz_length] == '-') + { +- offset_sign = text[i] == '-' ? -1 : 1; ++ offset_sign = text[length - tz_length] == '-' ? -1 : 1; + break; + } +- if (i < 0) ++ if (tz_length > length) + return NULL; +- tz_length = length - i; ++ tz_start = text + length - tz_length; + + /* +hh:mm or -hh:mm */ +- if (tz_length == 6 && text[i+3] == ':') ++ if (tz_length == 6 && tz_start[3] == ':') + { +- if (!get_iso8601_int (text + i + 1, 2, &offset_hours) || +- !get_iso8601_int (text + i + 4, 2, &offset_minutes)) ++ if (!get_iso8601_int (tz_start + 1, 2, &offset_hours) || ++ !get_iso8601_int (tz_start + 4, 2, &offset_minutes)) + return NULL; + } + /* +hhmm or -hhmm */ + else if (tz_length == 5) + { +- if (!get_iso8601_int (text + i + 1, 2, &offset_hours) || +- !get_iso8601_int (text + i + 3, 2, &offset_minutes)) ++ if (!get_iso8601_int (tz_start + 1, 2, &offset_hours) || ++ !get_iso8601_int (tz_start + 3, 2, &offset_minutes)) + return NULL; + } + /* +hh or -hh */ + else if (tz_length == 3) + { +- if (!get_iso8601_int (text + i + 1, 2, &offset_hours)) ++ if (!get_iso8601_int (tz_start + 1, 2, &offset_hours)) + return NULL; + offset_minutes = 0; + } + else + return NULL; + +- *tz_offset = i; +- tz = g_time_zone_new_identifier (text + i); ++ *tz_offset = tz_start - text; ++ tz = g_time_zone_new_identifier (tz_start); + + /* Double-check that the GTimeZone matches our interpretation of the timezone. + * This can fail because our interpretation is less strict than (for example) +@@ -1415,11 +1419,11 @@ static gboolean + parse_iso8601_time (const gchar *text, gsize length, + gint *hour, gint *minute, gdouble *seconds, GTimeZone **tz) + { +- gssize tz_offset = -1; ++ size_t tz_offset = 0; + + /* Check for timezone suffix */ + *tz = parse_iso8601_timezone (text, length, &tz_offset); +- if (tz_offset >= 0) ++ if (*tz != NULL) + length = tz_offset; + + /* hh:mm:ss(.sss) */ +@@ -1497,7 +1501,8 @@ parse_iso8601_time (const gchar *text, gsize length, + GDateTime * + g_date_time_new_from_iso8601 (const gchar *text, GTimeZone *default_tz) + { +- gint length, date_length = -1; ++ size_t length, date_length = 0; ++ gboolean date_length_set = FALSE; + gint hour = 0, minute = 0; + gdouble seconds = 0.0; + GTimeZone *tz = NULL; +@@ -1508,11 +1513,15 @@ g_date_time_new_from_iso8601 (const gchar *text, GTimeZone *default_tz) + /* Count length of string and find date / time separator ('T', 't', or ' ') */ + for (length = 0; text[length] != '\0'; length++) + { +- if (date_length < 0 && (text[length] == 'T' || text[length] == 't' || text[length] == ' ')) +- date_length = length; ++ if (!date_length_set && (text[length] == 'T' || text[length] == 't' || text[length] == ' ')) ++ { ++ date_length = length; ++ date_length_set = TRUE; ++ } ++ + } + +- if (date_length < 0) ++ if (!date_length_set) + return NULL; + + if (!parse_iso8601_time (text + date_length + 1, length - (date_length + 1), +diff --git a/glib/tests/gdatetime.c b/glib/tests/gdatetime.c +index 49390c9..d790af9 100644 +--- a/glib/tests/gdatetime.c ++++ b/glib/tests/gdatetime.c +@@ -859,6 +859,23 @@ test_GDateTime_new_from_iso8601 (void) + * NaN */ + dt = g_date_time_new_from_iso8601 ("0005306 000001,666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666600080000-00", NULL); + g_assert_null (dt); ++ ++ /* Various invalid timezone offsets which look like they could be in ++ * `+hh:mm`, `-hh:mm`, `+hhmm`, `-hhmm`, `+hh` or `-hh` format */ ++ dt = g_date_time_new_from_iso8601 ("2025-02-18T18:14:00+01:xx", NULL); ++ g_assert_null (dt); ++ dt = g_date_time_new_from_iso8601 ("2025-02-18T18:14:00+xx:00", NULL); ++ g_assert_null (dt); ++ dt = g_date_time_new_from_iso8601 ("2025-02-18T18:14:00+xx:xx", NULL); ++ g_assert_null (dt); ++ dt = g_date_time_new_from_iso8601 ("2025-02-18T18:14:00+01xx", NULL); ++ g_assert_null (dt); ++ dt = g_date_time_new_from_iso8601 ("2025-02-18T18:14:00+xx00", NULL); ++ g_assert_null (dt); ++ dt = g_date_time_new_from_iso8601 ("2025-02-18T18:14:00+xxxx", NULL); ++ g_assert_null (dt); ++ dt = g_date_time_new_from_iso8601 ("2025-02-18T18:14:00+xx", NULL); ++ g_assert_null (dt); + } + + typedef struct { +-- +2.47.1 + diff --git a/glib2.spec b/glib2.spec index 8ad8775..1549c31 100644 --- a/glib2.spec +++ b/glib2.spec @@ -1,4 +1,4 @@ -%define anolis_release 2 +%define anolis_release 3 Name: glib2 Version: 2.78.3 Release: %{anolis_release}%{?dist} @@ -8,6 +8,9 @@ License: LGPLv2+ URL: https://www.gtk.org Source0: https://download.gnome.org/sources/glib/2.78/glib-%{version}.tar.xz +# Reference to https://gitlab.gnome.org/GNOME/glib/-/commit/c9b03bdb7ca9283e4ff6ab809dab04436332b611 +Patch1001: 1001-Backport-patch-to-fix-CVE-2025-3360.patch + BuildRequires: gcc meson >= 0.60.0 gettext gtk-doc perl-interpreter glibc-devel BuildRequires: systemtap-sdt-devel zlib-devel python3-devel BuildRequires: bash-completion >= 2.0 elfutils-libelf-devel libffi-devel >= 3.0.0 @@ -151,6 +154,9 @@ touch %{buildroot}%{_libdir}/gio/modules/giomodule.cache %doc NEWS README.md %changelog +* Sun Apr 27 2025 Chang Gao - 2.78.3-3 +- Fix CVE-2025-3360 + * Mon Apr 01 2024 Bo Ren - 2.78.3-2 - add changelog -- Gitee