diff --git a/RHEL-114086.patch b/RHEL-114086.patch new file mode 100644 index 0000000..a0e5181 --- /dev/null +++ b/RHEL-114086.patch @@ -0,0 +1,70 @@ +From f3eecc88f4f45b128c963d695a61b230d2665db5 Mon Sep 17 00:00:00 2001 +From: Philip Withnall +Date: Mon, 3 Feb 2025 18:27:21 +0000 +Subject: [PATCH] gdbusconnection: Prevent sending a serial of zero on overflow +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It finally happened: someone managed to keep a process alive long +enough, and using a single `GDBusConnection`, to overflow the +`last_serial` counter in the connection and send an invalid message with +serial of zero (which is disallowed by the D-Bus specification). + +Avoid that happening in future by skipping serials of zero on overflow, +and wrapping straight back around to 1. + +This looks a little more confusing than it is, because `last_serial` is +pre-incremented on use, so to skip zero, we explicitly set it to zero. +This is exactly what happens when the `GDBusConnection` is initialised +anyway. + +I can’t think of a way to add a unit test for this — there is no way to +affect the value of `last_serial` except by sending messages (each one +increments it), and in order to get it to overflow by sending messages +at 1kHz, the test would have to run for 49 days. + +Instead, I tested this manually by temporarily modifying +`GDBusConnection` to initialise `last_serial` to `G_MAXUINT32 - 3`, then +checked that the unit tests all still passed, and that the overflow code +was being executed. + +Signed-off-by: Philip Withnall + +Fixes: #3592 +--- + gio/gdbusconnection.c | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c +index b4cdc7e..45d7861 100644 +--- a/gio/gdbusconnection.c ++++ b/gio/gdbusconnection.c +@@ -1790,9 +1790,22 @@ g_dbus_connection_send_message_unlocked (GDBusConnection *connection, + goto out; + + if (flags & G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL) +- serial_to_use = g_dbus_message_get_serial (message); ++ { ++ serial_to_use = g_dbus_message_get_serial (message); ++ } + else +- serial_to_use = ++connection->last_serial; /* TODO: handle overflow */ ++ { ++ /* The serial_to_use must not be zero, as per ++ * https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-messages. */ ++ if (connection->last_serial == G_MAXUINT32) ++ connection->last_serial = 1; ++ else ++ connection->last_serial++; ++ ++ serial_to_use = connection->last_serial; ++ } ++ ++ g_assert (serial_to_use != 0); + + switch (blob[0]) + { +-- +2.47.3 + diff --git a/glib2.spec b/glib2.spec index 206c0c8..c0646c2 100644 --- a/glib2.spec +++ b/glib2.spec @@ -5,7 +5,7 @@ Name: glib2 Version: 2.56.4 -Release: 166%{?dist} +Release: 167%{?dist} Summary: A library of handy utility functions License: LGPLv2+ @@ -147,6 +147,9 @@ Patch29: CVE-2024-34397.patch # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/4356 Patch30: gdatetime-test.patch +# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/4470 +Patch31: RHEL-114086.patch + %description GLib is the low-level core library that forms the basis for projects such as GTK+ and GNOME. It provides data structure handling for C, @@ -344,6 +347,10 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || : %{_datadir}/installed-tests %changelog +* Wed Sep 17 2025 RHEL Packaging Agent - 2.56.4-167 +- gdbusconnection: Prevent sending a serial of zero on overflow +- Resolves: RHEL-114086 + * Fri Jul 11 2025 Michael Catanzaro - 2.56.4-166 - Add patches for CVE-2024-34397, CVE-2024-52533, CVE-2025-4373 - Update GDateTime test for new tzdata