Bug#1034149: unblock: (pre-approval): glib2.0/2.74.6-2
Control: tags -1 confirmed moreinfo
On 2023-04-10 13:17:32 +0100, Simon McVittie wrote:
> Package: release.debian.org
> Severity: normal
> User: release.debian.org@packages.debian.org
> Usertags: unblock
> X-Debbugs-Cc: glib2.0@packages.debian.org
> Control: affects -1 + src:glib2.0
>
> I've been using this proposed glib2.0 update for a few days and I'd like
> to upload it to unstable. There's nothing RC here, but it seems safer and
> easier to do several small bugfix updates rather than one large one.
Please go ahead and remove the moreinfo tag once the package is
available in unstable.
Cheers
>
> [ Reason ]
> Pick up stable-branch changes from upstream, which are expected to be
> released in 2.74.7 at some point.
>
> [ Impact ]
> If not accepted:
> - Peer-to-peer D-Bus servers implemented with GLib, such as the ones in
> gvfs and ibus, won't interoperate properly with sd-bus clients
> (GNOME/glib#2916)
> - Some multi-threaded uses of GDBus will have a use-after-free
> (GNOME/glib#2924)
> - glib2.0 will FTBFS in non-minimal Docker containers (GNOME/glib#3307)
>
> [ Tests ]
> Automated tests continue to pass, and I've been using this version on my
> laptop for several days. There is no specific test coverage for the changes.
>
> [ Risks ]
> High-visibility key package, but the changes are narrowly targeted.
>
> [ Checklist ]
> [x] all changes are documented in the d/changelog
> [x] I reviewed all changes and I approve them
> [x] attach debdiff against the package in testing
>
> unblock glib2.0/2.74.6-2
> diffstat for glib2.0-2.74.6 glib2.0-2.74.6
>
> debian/changelog | 13
> debian/patches/gdbus-Fix-an-accidental-string-freeze-break.patch | 31 ++
> debian/patches/gdbus-Never-buffer-reads-during-server-authentication.patch | 141 ++++++++++
> debian/patches/gdbusconnection-Make-GDBusMethodInvocation-transfer-a-bit.patch | 28 +
> debian/patches/gdbusinterfaceskeleton-Fix-a-use-after-free-of-a-GDBusMet.patch | 58 ++++
> debian/patches/gdbusinterfaceskeleton-Remove-an-unnecessary-helper-struc.patch | 83 +++++
> debian/patches/series | 6
> debian/patches/tests-Skip-assert-msg-test.py-if-gdb-fails.patch | 34 ++
> gio/gdbusauth.c | 50 ++-
> gio/gdbusconnection.c | 2
> gio/gdbusinterfaceskeleton.c | 24 -
> glib/tests/assert-msg-test.py | 6
> 12 files changed, 442 insertions(+), 34 deletions(-)
>
> diff -Nru glib2.0-2.74.6/debian/changelog glib2.0-2.74.6/debian/changelog
> --- glib2.0-2.74.6/debian/changelog 2023-03-02 20:53:53.000000000 +0000
> +++ glib2.0-2.74.6/debian/changelog 2023-04-04 09:55:32.000000000 +0100
> @@ -1,3 +1,16 @@
> +glib2.0 (2.74.6-2) unstable; urgency=medium
> +
> + * d/patches: Update to upstream 2.74.x branch commit
> + 2.74.6-12-ga1e169129, omitting Windows-specific changes
> + - Fix GDBus server interop with sd-bus clients (GNOME/glib#2916)
> + - Fix use-after-free of a GDBusMethodInvocation in some threaded
> + use patterns (GNOME/glib#2924)
> + - Fix a test failure resulting in FTBFS in some container environments
> + if gdb happens to be installed, but access to ptrace and
> + /proc/PID/mem is disallowed (GNOME/glib#3307)
> +
> + -- Simon McVittie <smcv@debian.org> Tue, 04 Apr 2023 09:55:32 +0100
> +
> glib2.0 (2.74.6-1) unstable; urgency=medium
>
> * New upstream stable release
> diff -Nru glib2.0-2.74.6/debian/patches/gdbusconnection-Make-GDBusMethodInvocation-transfer-a-bit.patch glib2.0-2.74.6/debian/patches/gdbusconnection-Make-GDBusMethodInvocation-transfer-a-bit.patch
> --- glib2.0-2.74.6/debian/patches/gdbusconnection-Make-GDBusMethodInvocation-transfer-a-bit.patch 1970-01-01 01:00:00.000000000 +0100
> +++ glib2.0-2.74.6/debian/patches/gdbusconnection-Make-GDBusMethodInvocation-transfer-a-bit.patch 2023-04-04 09:55:32.000000000 +0100
> @@ -0,0 +1,28 @@
> +From: Philip Withnall <pwithnall@endlessos.org>
> +Date: Wed, 22 Feb 2023 12:50:10 +0000
> +Subject: gdbusconnection: Make GDBusMethodInvocation transfer a bit clearer
> +
> +Add a missing steal call in `schedule_method_call()`. This introduces no
> +functional changes, but documents the ownership transfer more clearly.
> +
> +Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
> +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2924
> +Origin: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3298
> +Applied-upstream: 2.74.7, commit:2da9ca2727a559a5e6b517582d14ba05d963f603
> +---
> + gio/gdbusconnection.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c
> +index 663cd95..368898d 100644
> +--- a/gio/gdbusconnection.c
> ++++ b/gio/gdbusconnection.c
> +@@ -5048,7 +5048,7 @@ schedule_method_call (GDBusConnection *connection,
> + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT);
> + g_source_set_callback (idle_source,
> + call_in_idle_cb,
> +- invocation,
> ++ g_steal_pointer (&invocation),
> + g_object_unref);
> + g_source_set_static_name (idle_source, "[gio, " __FILE__ "] call_in_idle_cb");
> + g_source_attach (idle_source, main_context);
> diff -Nru glib2.0-2.74.6/debian/patches/gdbus-Fix-an-accidental-string-freeze-break.patch glib2.0-2.74.6/debian/patches/gdbus-Fix-an-accidental-string-freeze-break.patch
> --- glib2.0-2.74.6/debian/patches/gdbus-Fix-an-accidental-string-freeze-break.patch 1970-01-01 01:00:00.000000000 +0100
> +++ glib2.0-2.74.6/debian/patches/gdbus-Fix-an-accidental-string-freeze-break.patch 2023-04-04 09:55:32.000000000 +0100
> @@ -0,0 +1,31 @@
> +From: Philip Withnall <pwithnall@endlessos.org>
> +Date: Thu, 2 Mar 2023 12:37:48 +0000
> +Subject: gdbus: Fix an accidental string freeze break
> +
> +Commit d982c8607 accidentally broke the string freeze on `glib-2-74` by
> +adding a new translatable string.
> +
> +We can avoid that by reusing an existing string which has a similar
> +meaning.
> +
> +Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
> +Bug: https://gitlab.gnome.org/Teams/Translation/Coordination/-/issues/47
> +Origin: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3303
> +Applied-upstream: 2.74.7, commit:be83335ecae64b0cd7a133966eba42e803cf8695
> +---
> + gio/gdbusauth.c | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/gio/gdbusauth.c b/gio/gdbusauth.c
> +index b52a06e..455484d 100644
> +--- a/gio/gdbusauth.c
> ++++ b/gio/gdbusauth.c
> +@@ -1042,7 +1042,7 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> + g_set_error_literal (error,
> + G_IO_ERROR,
> + G_IO_ERROR_FAILED,
> +- _ ("Unexpected lack of content trying to read a byte"));
> ++ _ ("Unexpected lack of content trying to read a line"));
> + else
> + g_propagate_error (error, local_error);
> + goto out;
> diff -Nru glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Fix-a-use-after-free-of-a-GDBusMet.patch glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Fix-a-use-after-free-of-a-GDBusMet.patch
> --- glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Fix-a-use-after-free-of-a-GDBusMet.patch 1970-01-01 01:00:00.000000000 +0100
> +++ glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Fix-a-use-after-free-of-a-GDBusMet.patch 2023-04-04 09:55:32.000000000 +0100
> @@ -0,0 +1,58 @@
> +From: Philip Withnall <pwithnall@endlessos.org>
> +Date: Wed, 22 Feb 2023 12:47:36 +0000
> +Subject: gdbusinterfaceskeleton: Fix a use-after-free of a
> + GDBusMethodInvocation
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset="utf-8"
> +Content-Transfer-Encoding: 8bit
> +
> +This `GDBusMethodInvocation` may be shared across threads, with no
> +guarantee on the strong ref in one thread outlasting any refs in other
> +threads — so it needs a ref in this helper struct.
> +
> +This should fix a use-after-free where the `GDBusMethodInvocation` is
> +freed from `g_value_unset()` after `g_signal_emit()` returns in
> +`dispatch_in_thread_func()` in one thread; but then dereferenced again
> +in `g_source_destroy_internal()` from another thread.
> +
> +Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
> +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2924
> +Origin: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3298
> +Applied-upstream: 2.74.7, commit:b29892237d3d0fa9b4615c9428d438aec60f1d82
> +---
> + gio/gdbusinterfaceskeleton.c | 9 ++++++---
> + 1 file changed, 6 insertions(+), 3 deletions(-)
> +
> +diff --git a/gio/gdbusinterfaceskeleton.c b/gio/gdbusinterfaceskeleton.c
> +index d28282f..a2a79fe 100644
> +--- a/gio/gdbusinterfaceskeleton.c
> ++++ b/gio/gdbusinterfaceskeleton.c
> +@@ -462,14 +462,17 @@ typedef struct
> + {
> + gint ref_count; /* (atomic) */
> + GDBusInterfaceMethodCallFunc method_call_func;
> +- GDBusMethodInvocation *invocation;
> ++ GDBusMethodInvocation *invocation; /* (owned) */
> + } DispatchData;
> +
> + static void
> + dispatch_data_unref (DispatchData *data)
> + {
> + if (g_atomic_int_dec_and_test (&data->ref_count))
> +- g_slice_free (DispatchData, data);
> ++ {
> ++ g_clear_object (&data->invocation);
> ++ g_slice_free (DispatchData, data);
> ++ }
> + }
> +
> + static DispatchData *
> +@@ -628,7 +631,7 @@ g_dbus_interface_method_dispatch_helper (GDBusInterfaceSkeleton *interface
> +
> + data = g_slice_new0 (DispatchData);
> + data->method_call_func = method_call_func;
> +- data->invocation = invocation;
> ++ data->invocation = g_object_ref (invocation);
> + data->ref_count = 1;
> +
> + task = g_task_new (interface, NULL, NULL, NULL);
> diff -Nru glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Remove-an-unnecessary-helper-struc.patch glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Remove-an-unnecessary-helper-struc.patch
> --- glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Remove-an-unnecessary-helper-struc.patch 1970-01-01 01:00:00.000000000 +0100
> +++ glib2.0-2.74.6/debian/patches/gdbusinterfaceskeleton-Remove-an-unnecessary-helper-struc.patch 2023-04-04 09:55:32.000000000 +0100
> @@ -0,0 +1,83 @@
> +From: Philip Withnall <pwithnall@endlessos.org>
> +Date: Wed, 22 Feb 2023 12:40:49 +0000
> +Subject: gdbusinterfaceskeleton: Remove an unnecessary helper struct member
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset="utf-8"
> +Content-Transfer-Encoding: 8bit
> +
> +The `GDBusInterfaceSkeleton` is already stored as the source object of
> +the `GTask` here, with a strong reference.
> +
> +Storing it again in the task’s data struct is redundant, and makes it
> +look like the `GDBusInterfaceSkeleton` is being used without holding a
> +strong reference. (There’s not actually a bug there though: the strong
> +reference from the `GTask` outlives the data struct, so is sufficient.)
> +
> +Remove the unnecessary helper struct member to clarify the code a bit.
> +
> +Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
> +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2924
> +Origin: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3298
> +Applied-upstream: 2.74.7, commit:d90fbc36367534f941941abb7e76e4c7cd8ed6b8
> +---
> + gio/gdbusinterfaceskeleton.c | 15 +++++++--------
> + 1 file changed, 7 insertions(+), 8 deletions(-)
> +
> +diff --git a/gio/gdbusinterfaceskeleton.c b/gio/gdbusinterfaceskeleton.c
> +index 3f07d4d..d28282f 100644
> +--- a/gio/gdbusinterfaceskeleton.c
> ++++ b/gio/gdbusinterfaceskeleton.c
> +@@ -461,7 +461,6 @@ dbus_interface_interface_init (GDBusInterfaceIface *iface)
> + typedef struct
> + {
> + gint ref_count; /* (atomic) */
> +- GDBusInterfaceSkeleton *interface;
> + GDBusInterfaceMethodCallFunc method_call_func;
> + GDBusMethodInvocation *invocation;
> + } DispatchData;
> +@@ -502,16 +501,17 @@ dispatch_in_thread_func (GTask *task,
> + GCancellable *cancellable)
> + {
> + DispatchData *data = task_data;
> ++ GDBusInterfaceSkeleton *interface = g_task_get_source_object (task);
> + GDBusInterfaceSkeletonFlags flags;
> + GDBusObject *object;
> + gboolean authorized;
> +
> +- g_mutex_lock (&data->interface->priv->lock);
> +- flags = data->interface->priv->flags;
> +- object = data->interface->priv->object;
> ++ g_mutex_lock (&interface->priv->lock);
> ++ flags = interface->priv->flags;
> ++ object = interface->priv->object;
> + if (object != NULL)
> + g_object_ref (object);
> +- g_mutex_unlock (&data->interface->priv->lock);
> ++ g_mutex_unlock (&interface->priv->lock);
> +
> + /* first check on the enclosing object (if any), then the interface */
> + authorized = TRUE;
> +@@ -519,13 +519,13 @@ dispatch_in_thread_func (GTask *task,
> + {
> + g_signal_emit_by_name (object,
> + "authorize-method",
> +- data->interface,
> ++ interface,
> + data->invocation,
> + &authorized);
> + }
> + if (authorized)
> + {
> +- g_signal_emit (data->interface,
> ++ g_signal_emit (interface,
> + signals[G_AUTHORIZE_METHOD_SIGNAL],
> + 0,
> + data->invocation,
> +@@ -627,7 +627,6 @@ g_dbus_interface_method_dispatch_helper (GDBusInterfaceSkeleton *interface
> + DispatchData *data;
> +
> + data = g_slice_new0 (DispatchData);
> +- data->interface = interface;
> + data->method_call_func = method_call_func;
> + data->invocation = invocation;
> + data->ref_count = 1;
> diff -Nru glib2.0-2.74.6/debian/patches/gdbus-Never-buffer-reads-during-server-authentication.patch glib2.0-2.74.6/debian/patches/gdbus-Never-buffer-reads-during-server-authentication.patch
> --- glib2.0-2.74.6/debian/patches/gdbus-Never-buffer-reads-during-server-authentication.patch 1970-01-01 01:00:00.000000000 +0100
> +++ glib2.0-2.74.6/debian/patches/gdbus-Never-buffer-reads-during-server-authentication.patch 2023-04-04 09:55:32.000000000 +0100
> @@ -0,0 +1,141 @@
> +From: Marius Vollmer <mvollmer@redhat.com>
> +Date: Mon, 13 Feb 2023 14:12:52 +0200
> +Subject: gdbus: Never buffer reads during server authentication
> +
> +Otherwise, the content of the buffer is thrown away when switching
> +from reading via a GDataInputStream to unbuffered reads when waiting
> +for the "BEGIN" line.
> +
> +(The code already tried to protect against over-reading like this by
> +using unbuffered reads for the last few lines of the auth protocol,
> +but it might already be too late at that point. The buffer of the
> +GDataInputStream might already contain the "BEGIN" line for example.)
> +
> +This matters when connecting a sd-bus client directly to a GDBus
> +client. A sd-bus client optimistically sends the whole auth
> +conversation in one go without waiting for intermediate replies. This
> +is done to improve performance for the many short-lived connections
> +that are typically made.
> +
> +Bug: https://gitlab.gnome.org/GNOME/glib/-/issues/2916
> +Origin: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3300
> +Applied-upstream: 2.74.7, commit:d982c86078741671949a6800f60d450901497e4e
> +---
> + gio/gdbusauth.c | 50 +++++++++++++++++++++++++++++++-------------------
> + 1 file changed, 31 insertions(+), 19 deletions(-)
> +
> +diff --git a/gio/gdbusauth.c b/gio/gdbusauth.c
> +index 6710368..b52a06e 100644
> +--- a/gio/gdbusauth.c
> ++++ b/gio/gdbusauth.c
> +@@ -949,7 +949,6 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> + {
> + gboolean ret;
> + ServerState state;
> +- GDataInputStream *dis;
> + GDataOutputStream *dos;
> + GError *local_error;
> + gchar *line;
> +@@ -965,7 +964,6 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> + _g_dbus_auth_add_mechs (auth, observer);
> +
> + ret = FALSE;
> +- dis = NULL;
> + dos = NULL;
> + mech = NULL;
> + negotiated_capabilities = 0;
> +@@ -981,13 +979,18 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> + goto out;
> + }
> +
> +- dis = G_DATA_INPUT_STREAM (g_data_input_stream_new (g_io_stream_get_input_stream (auth->priv->stream)));
> ++ /* We use an extremely slow (but reliable) line reader for input
> ++ * instead of something buffered - this basically does a recvfrom()
> ++ * system call per character
> ++ *
> ++ * (the problem with using GDataInputStream's read_line is that
> ++ * because of buffering it might start reading into the first D-Bus
> ++ * message that appears after "BEGIN\r\n"....)
> ++ */
> ++
> + dos = G_DATA_OUTPUT_STREAM (g_data_output_stream_new (g_io_stream_get_output_stream (auth->priv->stream)));
> +- g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (dis), FALSE);
> + g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (dos), FALSE);
> +
> +- g_data_input_stream_set_newline_type (dis, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
> +-
> + /* read the NUL-byte, possibly with credentials attached */
> + #ifndef G_CREDENTIALS_PREFER_MESSAGE_PASSING
> + if (G_IS_SOCKET_CONNECTION (auth->priv->stream))
> +@@ -1026,11 +1029,22 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> + }
> + else
> + {
> ++ gchar c;
> ++ gssize num_read;
> ++
> + local_error = NULL;
> +- (void)g_data_input_stream_read_byte (dis, cancellable, &local_error);
> +- if (local_error != NULL)
> ++ num_read = g_input_stream_read (g_io_stream_get_input_stream (auth->priv->stream),
> ++ &c, 1,
> ++ cancellable, &local_error);
> ++ if (num_read != 1 || local_error != NULL)
> + {
> +- g_propagate_error (error, local_error);
> ++ if (local_error == NULL)
> ++ g_set_error_literal (error,
> ++ G_IO_ERROR,
> ++ G_IO_ERROR_FAILED,
> ++ _ ("Unexpected lack of content trying to read a byte"));
> ++ else
> ++ g_propagate_error (error, local_error);
> + goto out;
> + }
> + }
> +@@ -1058,7 +1072,10 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> + {
> + case SERVER_STATE_WAITING_FOR_AUTH:
> + debug_print ("SERVER: WaitingForAuth");
> +- line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error);
> ++ line = _my_g_input_stream_read_line_safe (g_io_stream_get_input_stream (auth->priv->stream),
> ++ &line_length,
> ++ cancellable,
> ++ error);
> + debug_print ("SERVER: WaitingForAuth, read '%s'", line);
> + if (line == NULL)
> + goto out;
> +@@ -1276,7 +1293,10 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> +
> + case SERVER_STATE_WAITING_FOR_DATA:
> + debug_print ("SERVER: WaitingForData");
> +- line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error);
> ++ line = _my_g_input_stream_read_line_safe (g_io_stream_get_input_stream (auth->priv->stream),
> ++ &line_length,
> ++ cancellable,
> ++ error);
> + debug_print ("SERVER: WaitingForData, read '%s'", line);
> + if (line == NULL)
> + goto out;
> +@@ -1315,13 +1335,6 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> +
> + case SERVER_STATE_WAITING_FOR_BEGIN:
> + debug_print ("SERVER: WaitingForBegin");
> +- /* Use extremely slow (but reliable) line reader - this basically
> +- * does a recvfrom() system call per character
> +- *
> +- * (the problem with using GDataInputStream's read_line is that because of
> +- * buffering it might start reading into the first D-Bus message that
> +- * appears after "BEGIN\r\n"....)
> +- */
> + line = _my_g_input_stream_read_line_safe (g_io_stream_get_input_stream (auth->priv->stream),
> + &line_length,
> + cancellable,
> +@@ -1380,7 +1393,6 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
> +
> + out:
> + g_clear_object (&mech);
> +- g_clear_object (&dis);
> + g_clear_object (&dos);
> + g_clear_object (&own_credentials);
> +
> diff -Nru glib2.0-2.74.6/debian/patches/series glib2.0-2.74.6/debian/patches/series
> --- glib2.0-2.74.6/debian/patches/series 2023-03-02 20:53:53.000000000 +0000
> +++ glib2.0-2.74.6/debian/patches/series 2023-04-04 09:55:32.000000000 +0100
> @@ -1,3 +1,9 @@
> +gdbus-Never-buffer-reads-during-server-authentication.patch
> +gdbusinterfaceskeleton-Remove-an-unnecessary-helper-struc.patch
> +gdbusinterfaceskeleton-Fix-a-use-after-free-of-a-GDBusMet.patch
> +gdbusconnection-Make-GDBusMethodInvocation-transfer-a-bit.patch
> +gdbus-Fix-an-accidental-string-freeze-break.patch
> +tests-Skip-assert-msg-test.py-if-gdb-fails.patch
> tests-Don-t-rely-on-output-locale-of-sort-in-spawn-test.patch
> 01_gettext-desktopfiles.patch
> 0001-timer-test-use-volatile-for-locals.patch
> diff -Nru glib2.0-2.74.6/debian/patches/tests-Skip-assert-msg-test.py-if-gdb-fails.patch glib2.0-2.74.6/debian/patches/tests-Skip-assert-msg-test.py-if-gdb-fails.patch
> --- glib2.0-2.74.6/debian/patches/tests-Skip-assert-msg-test.py-if-gdb-fails.patch 1970-01-01 01:00:00.000000000 +0100
> +++ glib2.0-2.74.6/debian/patches/tests-Skip-assert-msg-test.py-if-gdb-fails.patch 2023-04-04 09:55:32.000000000 +0100
> @@ -0,0 +1,34 @@
> +From: Matt Turner <mattst88@gmail.com>
> +Date: Thu, 2 Mar 2023 00:13:22 -0500
> +Subject: tests: Skip assert-msg-test.py if gdb fails
> +
> +Similar to commit 6e44151bf74d, skip the test if gdb is unable to read
> +/proc/PID/mem, which gdb does as a fallback if ptrace is unavailable.
> +
> +This allows the test to skip when run under Gentoo's sandbox.
> +
> +(cherry picked from commit 19a8df9d8bff279a55b0fa3bb7ba4fbf7fcbefa8)
> +
> +Origin: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3307
> +Applied-upstream: 2.74.7, commit:f36c8876e796f20b6bddcfaf7dad7301c1049c04
> +---
> + glib/tests/assert-msg-test.py | 6 +++---
> + 1 file changed, 3 insertions(+), 3 deletions(-)
> +
> +diff --git a/glib/tests/assert-msg-test.py b/glib/tests/assert-msg-test.py
> +index 5e5f3fb..edc506f 100755
> +--- a/glib/tests/assert-msg-test.py
> ++++ b/glib/tests/assert-msg-test.py
> +@@ -157,9 +157,9 @@ class TestAssertMessage(unittest.TestCase):
> +
> + # Some CI environments disable ptrace (as they’re running in a
> + # container). If so, skip the test as there’s nothing we can do.
> +- if (
> +- result.info.returncode != 0
> +- and "ptrace: Operation not permitted" in result.err
> ++ if result.info.returncode != 0 and (
> ++ "ptrace: Operation not permitted" in result.err
> ++ or "warning: opening /proc/PID/mem file for lwp" in result.err
> + ):
> + self.skipTest("GDB is not functional due to ptrace being disabled")
> +
> diff -Nru glib2.0-2.74.6/gio/gdbusauth.c glib2.0-2.74.6/gio/gdbusauth.c
> --- glib2.0-2.74.6/gio/gdbusauth.c 2023-02-23 13:54:27.000000000 +0000
> +++ glib2.0-2.74.6/gio/gdbusauth.c 2023-04-10 13:09:07.000000000 +0100
> @@ -949,7 +949,6 @@
> {
> gboolean ret;
> ServerState state;
> - GDataInputStream *dis;
> GDataOutputStream *dos;
> GError *local_error;
> gchar *line;
> @@ -965,7 +964,6 @@
> _g_dbus_auth_add_mechs (auth, observer);
>
> ret = FALSE;
> - dis = NULL;
> dos = NULL;
> mech = NULL;
> negotiated_capabilities = 0;
> @@ -981,13 +979,18 @@
> goto out;
> }
>
> - dis = G_DATA_INPUT_STREAM (g_data_input_stream_new (g_io_stream_get_input_stream (auth->priv->stream)));
> + /* We use an extremely slow (but reliable) line reader for input
> + * instead of something buffered - this basically does a recvfrom()
> + * system call per character
> + *
> + * (the problem with using GDataInputStream's read_line is that
> + * because of buffering it might start reading into the first D-Bus
> + * message that appears after "BEGIN\r\n"....)
> + */
> +
> dos = G_DATA_OUTPUT_STREAM (g_data_output_stream_new (g_io_stream_get_output_stream (auth->priv->stream)));
> - g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (dis), FALSE);
> g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (dos), FALSE);
>
> - g_data_input_stream_set_newline_type (dis, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
> -
> /* read the NUL-byte, possibly with credentials attached */
> #ifndef G_CREDENTIALS_PREFER_MESSAGE_PASSING
> if (G_IS_SOCKET_CONNECTION (auth->priv->stream))
> @@ -1026,11 +1029,22 @@
> }
> else
> {
> + gchar c;
> + gssize num_read;
> +
> local_error = NULL;
> - (void)g_data_input_stream_read_byte (dis, cancellable, &local_error);
> - if (local_error != NULL)
> + num_read = g_input_stream_read (g_io_stream_get_input_stream (auth->priv->stream),
> + &c, 1,
> + cancellable, &local_error);
> + if (num_read != 1 || local_error != NULL)
> {
> - g_propagate_error (error, local_error);
> + if (local_error == NULL)
> + g_set_error_literal (error,
> + G_IO_ERROR,
> + G_IO_ERROR_FAILED,
> + _ ("Unexpected lack of content trying to read a line"));
> + else
> + g_propagate_error (error, local_error);
> goto out;
> }
> }
> @@ -1058,7 +1072,10 @@
> {
> case SERVER_STATE_WAITING_FOR_AUTH:
> debug_print ("SERVER: WaitingForAuth");
> - line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error);
> + line = _my_g_input_stream_read_line_safe (g_io_stream_get_input_stream (auth->priv->stream),
> + &line_length,
> + cancellable,
> + error);
> debug_print ("SERVER: WaitingForAuth, read '%s'", line);
> if (line == NULL)
> goto out;
> @@ -1276,7 +1293,10 @@
>
> case SERVER_STATE_WAITING_FOR_DATA:
> debug_print ("SERVER: WaitingForData");
> - line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error);
> + line = _my_g_input_stream_read_line_safe (g_io_stream_get_input_stream (auth->priv->stream),
> + &line_length,
> + cancellable,
> + error);
> debug_print ("SERVER: WaitingForData, read '%s'", line);
> if (line == NULL)
> goto out;
> @@ -1315,13 +1335,6 @@
>
> case SERVER_STATE_WAITING_FOR_BEGIN:
> debug_print ("SERVER: WaitingForBegin");
> - /* Use extremely slow (but reliable) line reader - this basically
> - * does a recvfrom() system call per character
> - *
> - * (the problem with using GDataInputStream's read_line is that because of
> - * buffering it might start reading into the first D-Bus message that
> - * appears after "BEGIN\r\n"....)
> - */
> line = _my_g_input_stream_read_line_safe (g_io_stream_get_input_stream (auth->priv->stream),
> &line_length,
> cancellable,
> @@ -1380,7 +1393,6 @@
>
> out:
> g_clear_object (&mech);
> - g_clear_object (&dis);
> g_clear_object (&dos);
> g_clear_object (&own_credentials);
>
> diff -Nru glib2.0-2.74.6/gio/gdbusconnection.c glib2.0-2.74.6/gio/gdbusconnection.c
> --- glib2.0-2.74.6/gio/gdbusconnection.c 2023-02-23 13:54:27.000000000 +0000
> +++ glib2.0-2.74.6/gio/gdbusconnection.c 2023-04-10 13:09:07.000000000 +0100
> @@ -5048,7 +5048,7 @@
> g_source_set_priority (idle_source, G_PRIORITY_DEFAULT);
> g_source_set_callback (idle_source,
> call_in_idle_cb,
> - invocation,
> + g_steal_pointer (&invocation),
> g_object_unref);
> g_source_set_static_name (idle_source, "[gio, " __FILE__ "] call_in_idle_cb");
> g_source_attach (idle_source, main_context);
> diff -Nru glib2.0-2.74.6/gio/gdbusinterfaceskeleton.c glib2.0-2.74.6/gio/gdbusinterfaceskeleton.c
> --- glib2.0-2.74.6/gio/gdbusinterfaceskeleton.c 2023-02-23 13:54:27.000000000 +0000
> +++ glib2.0-2.74.6/gio/gdbusinterfaceskeleton.c 2023-04-10 13:09:07.000000000 +0100
> @@ -461,16 +461,18 @@
> typedef struct
> {
> gint ref_count; /* (atomic) */
> - GDBusInterfaceSkeleton *interface;
> GDBusInterfaceMethodCallFunc method_call_func;
> - GDBusMethodInvocation *invocation;
> + GDBusMethodInvocation *invocation; /* (owned) */
> } DispatchData;
>
> static void
> dispatch_data_unref (DispatchData *data)
> {
> if (g_atomic_int_dec_and_test (&data->ref_count))
> - g_slice_free (DispatchData, data);
> + {
> + g_clear_object (&data->invocation);
> + g_slice_free (DispatchData, data);
> + }
> }
>
> static DispatchData *
> @@ -502,16 +504,17 @@
> GCancellable *cancellable)
> {
> DispatchData *data = task_data;
> + GDBusInterfaceSkeleton *interface = g_task_get_source_object (task);
> GDBusInterfaceSkeletonFlags flags;
> GDBusObject *object;
> gboolean authorized;
>
> - g_mutex_lock (&data->interface->priv->lock);
> - flags = data->interface->priv->flags;
> - object = data->interface->priv->object;
> + g_mutex_lock (&interface->priv->lock);
> + flags = interface->priv->flags;
> + object = interface->priv->object;
> if (object != NULL)
> g_object_ref (object);
> - g_mutex_unlock (&data->interface->priv->lock);
> + g_mutex_unlock (&interface->priv->lock);
>
> /* first check on the enclosing object (if any), then the interface */
> authorized = TRUE;
> @@ -519,13 +522,13 @@
> {
> g_signal_emit_by_name (object,
> "authorize-method",
> - data->interface,
> + interface,
> data->invocation,
> &authorized);
> }
> if (authorized)
> {
> - g_signal_emit (data->interface,
> + g_signal_emit (interface,
> signals[G_AUTHORIZE_METHOD_SIGNAL],
> 0,
> data->invocation,
> @@ -627,9 +630,8 @@
> DispatchData *data;
>
> data = g_slice_new0 (DispatchData);
> - data->interface = interface;
> data->method_call_func = method_call_func;
> - data->invocation = invocation;
> + data->invocation = g_object_ref (invocation);
> data->ref_count = 1;
>
> task = g_task_new (interface, NULL, NULL, NULL);
> diff -Nru glib2.0-2.74.6/glib/tests/assert-msg-test.py glib2.0-2.74.6/glib/tests/assert-msg-test.py
> --- glib2.0-2.74.6/glib/tests/assert-msg-test.py 2023-02-23 13:54:27.000000000 +0000
> +++ glib2.0-2.74.6/glib/tests/assert-msg-test.py 2023-04-10 13:09:07.000000000 +0100
> @@ -157,9 +157,9 @@
>
> # Some CI environments disable ptrace (as they’re running in a
> # container). If so, skip the test as there’s nothing we can do.
> - if (
> - result.info.returncode != 0
> - and "ptrace: Operation not permitted" in result.err
> + if result.info.returncode != 0 and (
> + "ptrace: Operation not permitted" in result.err
> + or "warning: opening /proc/PID/mem file for lwp" in result.err
> ):
> self.skipTest("GDB is not functional due to ptrace being disabled")
>
--
Sebastian Ramacher
Reply to: