Bug#944133: buster-pu: package glib2.0/2.58.3-2+deb10u2
On Wed, 06 Nov 2019 at 12:08:47 +0000, Adam D. Barratt wrote:
> On 2019-11-04 19:12, Simon McVittie wrote:
> > A recent security fix to ibus (CVE-2019-14822, #940267, DSA-4525-1)
> > exposed an interoperability bug between GLib's implementation of D-Bus
> > and the reference implementation libdbus (#941018).
>
> This looks OK to me, but will need a d-i ACK due to the udeb build; thanks.
Here's a final debdiff. The only change outside debian/changelog was to add
the correct branch to the Vcs-Git field.
smcv
diffstat for glib2.0-2.58.3 glib2.0-2.58.3
changelog | 16
control | 3
control.in | 3
patches/Add-a-test-for-GDBusServer-authentication.patch | 536 ++++++++++
patches/GDBus-prefer-getsockopt-style-credentials-passing-APIs.patch | 167 +++
patches/credentials-Invalid-Linux-struct-ucred-means-no-informati.patch | 117 ++
patches/gdbus-server-auth-test-Create-temporary-directory-for-Uni.patch | 191 +++
patches/gdbus-server-auth-test-Include-gcredentialsprivate.h.patch | 41
patches/series | 5
9 files changed, 1077 insertions(+), 2 deletions(-)
diff -Nru glib2.0-2.58.3/debian/changelog glib2.0-2.58.3/debian/changelog
--- glib2.0-2.58.3/debian/changelog 2019-07-30 10:41:51.000000000 +0100
+++ glib2.0-2.58.3/debian/changelog 2019-11-06 08:29:15.000000000 +0000
@@ -1,3 +1,19 @@
+glib2.0 (2.58.3-2+deb10u2) buster; urgency=medium
+
+ * Team upload
+ * d/p/credentials-Invalid-Linux-struct-ucred-means-no-informati.patch,
+ d/p/GDBus-prefer-getsockopt-style-credentials-passing-APIs.patch:
+ Ensure libdbus clients can authenticate with a GDBusServer like the
+ one in ibus, backported from upstream 2.62.x branch (Closes: #941018)
+ * d/p/Add-a-test-for-GDBusServer-authentication.patch,
+ d/p/gdbus-server-auth-test-Create-temporary-directory-for-Uni.patch,
+ d/p/gdbus-server-auth-test-Include-gcredentialsprivate.h.patch:
+ Backport regression test for #941018
+ * Build-depend on libdbus-1-dev for better test coverage
+ * d/control.in: Set branch to debian/buster in Vcs-Git
+
+ -- Simon McVittie <smcv@debian.org> Wed, 06 Nov 2019 08:29:15 +0000
+
glib2.0 (2.58.3-2+deb10u1) buster; urgency=medium
* Team upload
diff -Nru glib2.0-2.58.3/debian/control glib2.0-2.58.3/debian/control
--- glib2.0-2.58.3/debian/control 2019-07-30 10:41:51.000000000 +0100
+++ glib2.0-2.58.3/debian/control 2019-11-06 08:29:15.000000000 +0000
@@ -18,6 +18,7 @@
gettext,
gnome-pkg-tools (>= 0.11),
gtk-doc-tools (>= 1.20),
+ libdbus-1-dev (>= 1.2.14),
libelf-dev (>= 0.142),
libffi-dev (>= 3.0.0),
libgamin-dev [!linux-any] | libfam-dev [!linux-any],
@@ -41,7 +42,7 @@
Standards-Version: 4.3.0
Homepage: http://www.gtk.org/
Vcs-Browser: https://salsa.debian.org/gnome-team/glib
-Vcs-Git: https://salsa.debian.org/gnome-team/glib.git
+Vcs-Git: https://salsa.debian.org/gnome-team/glib.git -b debian/buster
Package: libglib2.0-0
Architecture: any
diff -Nru glib2.0-2.58.3/debian/control.in glib2.0-2.58.3/debian/control.in
--- glib2.0-2.58.3/debian/control.in 2019-07-30 10:41:51.000000000 +0100
+++ glib2.0-2.58.3/debian/control.in 2019-11-06 08:29:15.000000000 +0000
@@ -14,6 +14,7 @@
gettext,
gnome-pkg-tools (>= 0.11),
gtk-doc-tools (>= 1.20),
+ libdbus-1-dev (>= 1.2.14),
libelf-dev (>= 0.142),
libffi-dev (>= 3.0.0),
libgamin-dev [!linux-any] | libfam-dev [!linux-any],
@@ -37,7 +38,7 @@
Standards-Version: 4.3.0
Homepage: http://www.gtk.org/
Vcs-Browser: https://salsa.debian.org/gnome-team/glib
-Vcs-Git: https://salsa.debian.org/gnome-team/glib.git
+Vcs-Git: https://salsa.debian.org/gnome-team/glib.git -b debian/buster
Package: libglib2.0-0
Architecture: any
diff -Nru glib2.0-2.58.3/debian/patches/Add-a-test-for-GDBusServer-authentication.patch glib2.0-2.58.3/debian/patches/Add-a-test-for-GDBusServer-authentication.patch
--- glib2.0-2.58.3/debian/patches/Add-a-test-for-GDBusServer-authentication.patch 1970-01-01 01:00:00.000000000 +0100
+++ glib2.0-2.58.3/debian/patches/Add-a-test-for-GDBusServer-authentication.patch 2019-11-06 08:29:15.000000000 +0000
@@ -0,0 +1,536 @@
+From: Simon McVittie <smcv@collabora.com>
+Date: Fri, 11 Oct 2019 19:02:55 +0100
+Subject: Add a test for GDBusServer authentication
+
+In particular, if libbdus is available, we test interoperability with
+a libdbus client: see GNOME/glib#1831. Because that issue describes a
+race condition, we do each test repeatedly to try to hit the failing
+case.
+
+Signed-off-by: Simon McVittie <smcv@collabora.com>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=941018
+Origin: upstream, 2.63.1, commit:9f962ebeac1d67223579ad0d261c4c8215f7c427
+---
+ gio/tests/gdbus-server-auth.c | 491 ++++++++++++++++++++++++++++++++++++++++++
+ gio/tests/meson.build | 8 +
+ 2 files changed, 499 insertions(+)
+ create mode 100644 gio/tests/gdbus-server-auth.c
+
+diff --git a/gio/tests/gdbus-server-auth.c b/gio/tests/gdbus-server-auth.c
+new file mode 100644
+index 0000000..6a72ba6
+--- /dev/null
++++ b/gio/tests/gdbus-server-auth.c
+@@ -0,0 +1,491 @@
++/*
++ * Copyright 2019 Collabora Ltd.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ */
++
++#include "config.h"
++
++#include <gio/gio.h>
++
++#ifdef HAVE_DBUS1
++#include <dbus/dbus.h>
++#endif
++
++typedef enum
++{
++ INTEROP_FLAGS_EXTERNAL = (1 << 0),
++ INTEROP_FLAGS_ANONYMOUS = (1 << 1),
++ INTEROP_FLAGS_SHA1 = (1 << 2),
++ INTEROP_FLAGS_TCP = (1 << 3),
++ INTEROP_FLAGS_LIBDBUS = (1 << 4),
++ INTEROP_FLAGS_NONE = 0
++} InteropFlags;
++
++static gboolean
++allow_external_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
++ const char *mechanism,
++ G_GNUC_UNUSED gpointer user_data)
++{
++ if (g_strcmp0 (mechanism, "EXTERNAL") == 0)
++ {
++ g_debug ("Accepting EXTERNAL authentication");
++ return TRUE;
++ }
++ else
++ {
++ g_debug ("Rejecting \"%s\" authentication: not EXTERNAL", mechanism);
++ return FALSE;
++ }
++}
++
++static gboolean
++allow_anonymous_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
++ const char *mechanism,
++ G_GNUC_UNUSED gpointer user_data)
++{
++ if (g_strcmp0 (mechanism, "ANONYMOUS") == 0)
++ {
++ g_debug ("Accepting ANONYMOUS authentication");
++ return TRUE;
++ }
++ else
++ {
++ g_debug ("Rejecting \"%s\" authentication: not ANONYMOUS", mechanism);
++ return FALSE;
++ }
++}
++
++static gboolean
++allow_sha1_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
++ const char *mechanism,
++ G_GNUC_UNUSED gpointer user_data)
++{
++ if (g_strcmp0 (mechanism, "DBUS_COOKIE_SHA1") == 0)
++ {
++ g_debug ("Accepting DBUS_COOKIE_SHA1 authentication");
++ return TRUE;
++ }
++ else
++ {
++ g_debug ("Rejecting \"%s\" authentication: not DBUS_COOKIE_SHA1",
++ mechanism);
++ return FALSE;
++ }
++}
++
++static gboolean
++allow_any_mechanism_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
++ const char *mechanism,
++ G_GNUC_UNUSED gpointer user_data)
++{
++ g_debug ("Accepting \"%s\" authentication", mechanism);
++ return TRUE;
++}
++
++static gboolean
++authorize_any_authenticated_peer_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
++ G_GNUC_UNUSED GIOStream *stream,
++ GCredentials *credentials,
++ G_GNUC_UNUSED gpointer user_data)
++{
++ if (credentials == NULL)
++ {
++ g_debug ("Authorizing peer with no credentials");
++ }
++ else
++ {
++ gchar *str = g_credentials_to_string (credentials);
++
++ g_debug ("Authorizing peer with credentials: %s", str);
++ g_free (str);
++ }
++
++ return TRUE;
++}
++
++static GDBusMessage *
++whoami_filter_cb (GDBusConnection *connection,
++ GDBusMessage *message,
++ gboolean incoming,
++ G_GNUC_UNUSED gpointer user_data)
++{
++ if (!incoming)
++ return message;
++
++ if (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL &&
++ g_strcmp0 (g_dbus_message_get_member (message), "WhoAmI") == 0)
++ {
++ GDBusMessage *reply = g_dbus_message_new_method_reply (message);
++ gint64 uid = -1;
++ gint64 pid = -1;
++#ifdef G_OS_UNIX
++ GCredentials *credentials = g_dbus_connection_get_peer_credentials (connection);
++
++ if (credentials != NULL)
++ {
++ uid = (gint64) g_credentials_get_unix_user (credentials, NULL);
++ pid = (gint64) g_credentials_get_unix_pid (credentials, NULL);
++ }
++#endif
++
++ g_dbus_message_set_body (reply,
++ g_variant_new ("(xx)", uid, pid));
++ g_dbus_connection_send_message (connection, reply,
++ G_DBUS_SEND_MESSAGE_FLAGS_NONE,
++ NULL, NULL);
++
++ /* handled */
++ g_object_unref (message);
++ return NULL;
++ }
++
++ return message;
++}
++
++static gboolean
++new_connection_cb (G_GNUC_UNUSED GDBusServer *server,
++ GDBusConnection *connection,
++ G_GNUC_UNUSED gpointer user_data)
++{
++ GCredentials *credentials = g_dbus_connection_get_peer_credentials (connection);
++
++ if (credentials == NULL)
++ {
++ g_debug ("New connection from peer with no credentials");
++ }
++ else
++ {
++ gchar *str = g_credentials_to_string (credentials);
++
++ g_debug ("New connection from peer with credentials: %s", str);
++ g_free (str);
++ }
++
++ g_object_ref (connection);
++ g_dbus_connection_add_filter (connection, whoami_filter_cb, NULL, NULL);
++ return TRUE;
++}
++
++#ifdef HAVE_DBUS1
++typedef struct
++{
++ DBusError error;
++ DBusConnection *conn;
++ DBusMessage *call;
++ DBusMessage *reply;
++} LibdbusCall;
++
++static void
++libdbus_call_task_cb (GTask *task,
++ G_GNUC_UNUSED gpointer source_object,
++ gpointer task_data,
++ G_GNUC_UNUSED GCancellable *cancellable)
++{
++ LibdbusCall *libdbus_call = task_data;
++
++ libdbus_call->reply = dbus_connection_send_with_reply_and_block (libdbus_call->conn,
++ libdbus_call->call,
++ -1,
++ &libdbus_call->error);
++}
++#endif /* HAVE_DBUS1 */
++
++static void
++store_result_cb (G_GNUC_UNUSED GObject *source_object,
++ GAsyncResult *res,
++ gpointer user_data)
++{
++ GAsyncResult **result = user_data;
++
++ g_assert_nonnull (result);
++ g_assert_null (*result);
++ *result = g_object_ref (res);
++}
++
++static void
++assert_expected_uid_pid (InteropFlags flags,
++ gint64 uid,
++ gint64 pid)
++{
++#ifdef G_OS_UNIX
++ if (flags & (INTEROP_FLAGS_ANONYMOUS | INTEROP_FLAGS_SHA1 | INTEROP_FLAGS_TCP))
++ {
++ /* No assertion. There is no guarantee whether credentials will be
++ * passed even though we didn't send them. Conversely, if
++ * credentials were not passed,
++ * g_dbus_connection_get_peer_credentials() always returns the
++ * credentials of the socket, and not the uid that a
++ * client might have proved it has by using DBUS_COOKIE_SHA1. */
++ }
++ else /* We should prefer EXTERNAL whenever it is allowed. */
++ {
++#ifdef __linux__
++ /* We know that both GDBus and libdbus support full credentials-passing
++ * on Linux. */
++ g_assert_cmpint (uid, ==, getuid ());
++ g_assert_cmpint (pid, ==, getpid ());
++#else
++ g_test_message ("Please open a merge request to add appropriate "
++ "assertions for your platform");
++#endif
++ }
++#endif /* G_OS_UNIX */
++}
++
++static void
++do_test_server_auth (const char *listenable_address,
++ InteropFlags flags)
++{
++ GError *error = NULL;
++ GDBusServer *server;
++ GDBusAuthObserver *observer;
++ GDBusServerFlags server_flags = G_DBUS_SERVER_FLAGS_RUN_IN_THREAD;
++ gchar *guid;
++ const char *connectable_address;
++ GDBusConnection *client;
++ GAsyncResult *result = NULL;
++ GVariant *tuple;
++ gint64 uid, pid;
++#ifdef HAVE_DBUS1
++ /* GNOME/glib#1831 seems to involve a race condition, so try a few times
++ * to see if we can trigger it. */
++ gsize i;
++ gsize n = 20;
++#endif
++
++ if (g_str_has_prefix (listenable_address, "tcp:") ||
++ g_str_has_prefix (listenable_address, "nonce-tcp:"))
++ g_assert_cmpint (flags & INTEROP_FLAGS_TCP, !=, 0);
++ else
++ g_assert_cmpint (flags & INTEROP_FLAGS_TCP, ==, 0);
++
++ g_test_message ("Testing GDBus server at %s / libdbus client, with flags: "
++ "external:%s "
++ "anonymous:%s "
++ "sha1:%s "
++ "tcp:%s",
++ listenable_address,
++ (flags & INTEROP_FLAGS_EXTERNAL) ? "true" : "false",
++ (flags & INTEROP_FLAGS_ANONYMOUS) ? "true" : "false",
++ (flags & INTEROP_FLAGS_SHA1) ? "true" : "false",
++ (flags & INTEROP_FLAGS_TCP) ? "true" : "false");
++
++#ifndef G_OS_UNIX
++ if (g_str_has_prefix (listenable_address, "unix:"))
++ {
++ g_test_skip ("unix: addresses only work on Unix");
++ return;
++ }
++#endif
++
++#if !defined(G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED) \
++ && !defined(G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED)
++ if (flags & INTEROP_FLAGS_EXTERNAL)
++ {
++ g_test_skip ("EXTERNAL authentication not implemented on this platform");
++ return;
++ }
++#endif
++
++ if (flags & INTEROP_FLAGS_ANONYMOUS)
++ server_flags |= G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS;
++
++ observer = g_dbus_auth_observer_new ();
++
++ if (flags & INTEROP_FLAGS_EXTERNAL)
++ g_signal_connect (observer, "allow-mechanism",
++ G_CALLBACK (allow_external_cb), NULL);
++ else if (flags & INTEROP_FLAGS_ANONYMOUS)
++ g_signal_connect (observer, "allow-mechanism",
++ G_CALLBACK (allow_anonymous_cb), NULL);
++ else if (flags & INTEROP_FLAGS_SHA1)
++ g_signal_connect (observer, "allow-mechanism",
++ G_CALLBACK (allow_sha1_cb), NULL);
++ else
++ g_signal_connect (observer, "allow-mechanism",
++ G_CALLBACK (allow_any_mechanism_cb), NULL);
++
++ g_signal_connect (observer, "authorize-authenticated-peer",
++ G_CALLBACK (authorize_any_authenticated_peer_cb),
++ NULL);
++
++ guid = g_dbus_generate_guid ();
++ server = g_dbus_server_new_sync (listenable_address,
++ server_flags,
++ guid,
++ observer,
++ NULL,
++ &error);
++ g_assert_no_error (error);
++ g_assert_nonnull (server);
++ g_signal_connect (server, "new-connection", G_CALLBACK (new_connection_cb), NULL);
++ g_dbus_server_start (server);
++ connectable_address = g_dbus_server_get_client_address (server);
++
++ result = NULL;
++ g_dbus_connection_new_for_address (connectable_address,
++ G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
++ NULL, NULL, store_result_cb, &result);
++
++ while (result == NULL)
++ g_main_context_iteration (NULL, TRUE);
++
++ client = g_dbus_connection_new_for_address_finish (result, &error);
++ g_assert_no_error (error);
++ g_assert_nonnull (client);
++ g_clear_object (&result);
++
++ g_dbus_connection_call (client, NULL, "/", "com.example.Test", "WhoAmI",
++ NULL, G_VARIANT_TYPE ("(xx)"),
++ G_DBUS_CALL_FLAGS_NONE, -1, NULL, store_result_cb,
++ &result);
++
++ while (result == NULL)
++ g_main_context_iteration (NULL, TRUE);
++
++ tuple = g_dbus_connection_call_finish (client, result, &error);
++ g_assert_no_error (error);
++ g_assert_nonnull (tuple);
++ g_clear_object (&result);
++ g_clear_object (&client);
++
++ uid = -2;
++ pid = -2;
++ g_variant_get (tuple, "(xx)", &uid, &pid);
++
++ g_debug ("Server says GDBus client is uid %" G_GINT64_FORMAT ", pid %" G_GINT64_FORMAT,
++ uid, pid);
++
++ assert_expected_uid_pid (flags, uid, pid);
++
++ g_clear_pointer (&tuple, g_variant_unref);
++
++#ifdef HAVE_DBUS1
++ for (i = 0; i < n; i++)
++ {
++ LibdbusCall libdbus_call = { DBUS_ERROR_INIT, NULL, NULL, NULL };
++ GTask *task;
++
++ libdbus_call.conn = dbus_connection_open_private (connectable_address,
++ &libdbus_call.error);
++ g_assert_cmpstr (libdbus_call.error.name, ==, NULL);
++ g_assert_nonnull (libdbus_call.conn);
++
++ libdbus_call.call = dbus_message_new_method_call (NULL, "/",
++ "com.example.Test",
++ "WhoAmI");
++
++ if (libdbus_call.call == NULL)
++ g_error ("Out of memory");
++
++ result = NULL;
++ task = g_task_new (NULL, NULL, store_result_cb, &result);
++ g_task_set_task_data (task, &libdbus_call, NULL);
++ g_task_run_in_thread (task, libdbus_call_task_cb);
++
++ while (result == NULL)
++ g_main_context_iteration (NULL, TRUE);
++
++ g_clear_object (&result);
++
++ g_assert_cmpstr (libdbus_call.error.name, ==, NULL);
++ g_assert_nonnull (libdbus_call.reply);
++
++ uid = -2;
++ pid = -2;
++ dbus_message_get_args (libdbus_call.reply, &libdbus_call.error,
++ DBUS_TYPE_INT64, &uid,
++ DBUS_TYPE_INT64, &pid,
++ DBUS_TYPE_INVALID);
++ g_assert_cmpstr (libdbus_call.error.name, ==, NULL);
++
++ g_debug ("Server says libdbus client %" G_GSIZE_FORMAT " is uid %" G_GINT64_FORMAT ", pid %" G_GINT64_FORMAT,
++ i, uid, pid);
++ assert_expected_uid_pid (flags | INTEROP_FLAGS_LIBDBUS, uid, pid);
++
++ dbus_connection_close (libdbus_call.conn);
++ dbus_connection_unref (libdbus_call.conn);
++ dbus_message_unref (libdbus_call.call);
++ dbus_message_unref (libdbus_call.reply);
++ g_clear_object (&task);
++ }
++#else /* !HAVE_DBUS1 */
++ g_test_skip ("Testing interop with libdbus not supported");
++#endif /* !HAVE_DBUS1 */
++
++ g_dbus_server_stop (server);
++ g_clear_object (&server);
++ g_clear_object (&observer);
++ g_free (guid);
++}
++
++static void
++test_server_auth (void)
++{
++ do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_NONE);
++}
++
++static void
++test_server_auth_tcp (void)
++{
++ do_test_server_auth ("tcp:host=127.0.0.1", INTEROP_FLAGS_TCP);
++}
++
++static void
++test_server_auth_anonymous (void)
++{
++ do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_ANONYMOUS);
++}
++
++static void
++test_server_auth_anonymous_tcp (void)
++{
++ do_test_server_auth ("tcp:host=127.0.0.1", INTEROP_FLAGS_ANONYMOUS | INTEROP_FLAGS_TCP);
++}
++
++static void
++test_server_auth_external (void)
++{
++ do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_EXTERNAL);
++}
++
++static void
++test_server_auth_sha1 (void)
++{
++ do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_SHA1);
++}
++
++static void
++test_server_auth_sha1_tcp (void)
++{
++ do_test_server_auth ("tcp:host=127.0.0.1", INTEROP_FLAGS_SHA1 | INTEROP_FLAGS_TCP);
++}
++
++int
++main (int argc,
++ char *argv[])
++{
++ g_test_init (&argc, &argv, NULL);
++
++ g_test_add_func ("/gdbus/server-auth", test_server_auth);
++ g_test_add_func ("/gdbus/server-auth/tcp", test_server_auth_tcp);
++ g_test_add_func ("/gdbus/server-auth/anonymous", test_server_auth_anonymous);
++ g_test_add_func ("/gdbus/server-auth/anonymous/tcp", test_server_auth_anonymous_tcp);
++ g_test_add_func ("/gdbus/server-auth/external", test_server_auth_external);
++ g_test_add_func ("/gdbus/server-auth/sha1", test_server_auth_sha1);
++ g_test_add_func ("/gdbus/server-auth/sha1/tcp", test_server_auth_sha1_tcp);
++
++ return g_test_run();
++}
+diff --git a/gio/tests/meson.build b/gio/tests/meson.build
+index dca33bd..2b59198 100644
+--- a/gio/tests/meson.build
++++ b/gio/tests/meson.build
+@@ -117,8 +117,16 @@ if dbus1_dep.found()
+ 'gdbus-serialization' : {
+ 'extra_sources' : ['gdbus-tests.c'],
+ 'dependencies' : [dbus1_dep],
++ },
++ 'gdbus-server-auth' : {
++ 'dependencies' : [dbus1_dep],
+ }
+ }]
++else
++ # We can build a cut-down version of this test without libdbus
++ gio_tests += [{
++ 'gdbus-server-auth' : {},
++ }]
+ endif
+
+ # Test programs buildable on UNIX only
diff -Nru glib2.0-2.58.3/debian/patches/credentials-Invalid-Linux-struct-ucred-means-no-informati.patch glib2.0-2.58.3/debian/patches/credentials-Invalid-Linux-struct-ucred-means-no-informati.patch
--- glib2.0-2.58.3/debian/patches/credentials-Invalid-Linux-struct-ucred-means-no-informati.patch 1970-01-01 01:00:00.000000000 +0100
+++ glib2.0-2.58.3/debian/patches/credentials-Invalid-Linux-struct-ucred-means-no-informati.patch 2019-11-06 08:29:15.000000000 +0000
@@ -0,0 +1,117 @@
+From: Simon McVittie <smcv@collabora.com>
+Date: Fri, 18 Oct 2019 10:55:09 +0100
+Subject: credentials: Invalid Linux struct ucred means "no information"
+
+On Linux, if getsockopt SO_PEERCRED is used on a TCP socket, one
+might expect it to fail with an appropriate error like ENOTSUP or
+EPROTONOSUPPORT. However, it appears that in fact it succeeds, but
+yields a credentials structure with pid 0, uid -1 and gid -1. These
+are not real process, user and group IDs that can be allocated to a
+real process (pid 0 needs to be reserved to give kill(0) its documented
+special semantics, and similarly uid and gid -1 need to be reserved for
+setresuid() and setresgid()) so it is not meaningful to signal them to
+high-level API users.
+
+An API user with Linux-specific knowledge can still inspect these fields
+via g_credentials_get_native() if desired.
+
+Similarly, if SO_PASSCRED is used to receive a SCM_CREDENTIALS message
+on a receiving Unix socket, but the sending socket had not enabled
+SO_PASSCRED at the time that the message was sent, it is possible
+for it to succeed but yield a credentials structure with pid 0, uid
+/proc/sys/kernel/overflowuid and gid /proc/sys/kernel/overflowgid. Even
+if we were to read those pseudo-files, we cannot distinguish between
+the overflow IDs and a real process that legitimately has the same IDs
+(typically they are set to 'nobody' and 'nogroup', which can be used
+by a real process), so we detect this situation by noticing that
+pid == 0, and to save syscalls we do not read the overflow IDs from
+/proc at all.
+
+This results in a small API change: g_credentials_is_same_user() now
+returns FALSE if we compare two credentials structures that are both
+invalid. This seems like reasonable, conservative behaviour: if we cannot
+prove that they are the same user, we should assume they are not.
+
+[Philip Withnall: Dropped new translatable string when backporting to
+`glib-2-62`.]
+
+Signed-off-by: Simon McVittie <smcv@collabora.com>
+Origin: upstream, 2.62.3, commit:5f9318af8f19756685c1b79cf8b76f3e66614d84
+---
+ gio/gcredentials.c | 42 +++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 39 insertions(+), 3 deletions(-)
+
+diff --git a/gio/gcredentials.c b/gio/gcredentials.c
+index cc0cd82..866c671 100644
+--- a/gio/gcredentials.c
++++ b/gio/gcredentials.c
+@@ -265,6 +265,35 @@ g_credentials_to_string (GCredentials *credentials)
+
+ /* ---------------------------------------------------------------------------------------------------- */
+
++#if G_CREDENTIALS_USE_LINUX_UCRED
++/*
++ * Check whether @native contains invalid data. If getsockopt SO_PEERCRED
++ * is used on a TCP socket, it succeeds but yields a credentials structure
++ * with pid 0, uid -1 and gid -1. Similarly, if SO_PASSCRED is used on a
++ * receiving Unix socket when the sending socket did not also enable
++ * SO_PASSCRED, it can succeed but yield a credentials structure with
++ * pid 0, uid /proc/sys/kernel/overflowuid and gid
++ * /proc/sys/kernel/overflowgid.
++ */
++static gboolean
++linux_ucred_check_valid (struct ucred *native,
++ GError **error)
++{
++ if (native->pid == 0
++ || native->uid == -1
++ || native->gid == -1)
++ {
++ g_set_error_literal (error,
++ G_IO_ERROR,
++ G_IO_ERROR_INVALID_DATA,
++ "GCredentials contains invalid data");
++ return FALSE;
++ }
++
++ return TRUE;
++}
++#endif
++
+ /**
+ * g_credentials_is_same_user:
+ * @credentials: A #GCredentials.
+@@ -294,7 +323,8 @@ g_credentials_is_same_user (GCredentials *credentials,
+
+ ret = FALSE;
+ #if G_CREDENTIALS_USE_LINUX_UCRED
+- if (credentials->native.uid == other_credentials->native.uid)
++ if (linux_ucred_check_valid (&credentials->native, NULL)
++ && credentials->native.uid == other_credentials->native.uid)
+ ret = TRUE;
+ #elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
+ if (credentials->native.cmcred_euid == other_credentials->native.cmcred_euid)
+@@ -453,7 +483,10 @@ g_credentials_get_unix_user (GCredentials *credentials,
+ g_return_val_if_fail (error == NULL || *error == NULL, -1);
+
+ #if G_CREDENTIALS_USE_LINUX_UCRED
+- ret = credentials->native.uid;
++ if (linux_ucred_check_valid (&credentials->native, error))
++ ret = credentials->native.uid;
++ else
++ ret = -1;
+ #elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
+ ret = credentials->native.cmcred_euid;
+ #elif G_CREDENTIALS_USE_NETBSD_UNPCBID
+@@ -499,7 +532,10 @@ g_credentials_get_unix_pid (GCredentials *credentials,
+ g_return_val_if_fail (error == NULL || *error == NULL, -1);
+
+ #if G_CREDENTIALS_USE_LINUX_UCRED
+- ret = credentials->native.pid;
++ if (linux_ucred_check_valid (&credentials->native, error))
++ ret = credentials->native.pid;
++ else
++ ret = -1;
+ #elif G_CREDENTIALS_USE_FREEBSD_CMSGCRED
+ ret = credentials->native.cmcred_pid;
+ #elif G_CREDENTIALS_USE_NETBSD_UNPCBID
diff -Nru glib2.0-2.58.3/debian/patches/GDBus-prefer-getsockopt-style-credentials-passing-APIs.patch glib2.0-2.58.3/debian/patches/GDBus-prefer-getsockopt-style-credentials-passing-APIs.patch
--- glib2.0-2.58.3/debian/patches/GDBus-prefer-getsockopt-style-credentials-passing-APIs.patch 1970-01-01 01:00:00.000000000 +0100
+++ glib2.0-2.58.3/debian/patches/GDBus-prefer-getsockopt-style-credentials-passing-APIs.patch 2019-11-06 08:29:15.000000000 +0000
@@ -0,0 +1,167 @@
+From: Simon McVittie <smcv@collabora.com>
+Date: Mon, 14 Oct 2019 08:47:39 +0100
+Subject: GDBus: prefer getsockopt()-style credentials-passing APIs
+
+Conceptually, a D-Bus server is really trying to determine the credentials
+of (the process that initiated) a connection, not the credentials that
+the process had when it sent a particular message. Ideally, it does
+this with a getsockopt()-style API that queries the credentials of the
+connection's initiator without requiring any particular cooperation from
+that process, avoiding a class of possible failures.
+
+The leading '\0' in the D-Bus protocol is primarily a workaround
+for platforms where the message-based credentials-passing API is
+strictly better than the getsockopt()-style API (for example, on
+FreeBSD, SCM_CREDS includes a process ID but getpeereid() does not),
+or where the getsockopt()-style API does not exist at all. As a result
+libdbus, the reference implementation of D-Bus, does not implement
+Linux SCM_CREDENTIALS at all - it has no reason to do so, because the
+SO_PEERCRED socket option is equally informative.
+
+This change makes GDBusServer on Linux more closely match the behaviour
+of libdbus.
+
+In particular, GNOME/glib#1831 indicates that when a libdbus client
+connects to a GDBus server, recvmsg() sometimes yields a SCM_CREDENTIALS
+message with cmsg_data={pid=0, uid=65534, gid=65534}. I think this is
+most likely a race condition in the early steps to connect:
+
+ client server
+ connect
+ accept
+ send '\0' <- race -> set SO_PASSCRED = 1
+ receive '\0'
+
+If the server wins the race:
+
+ client server
+ connect
+ accept
+ set SO_PASSCRED = 1
+ send '\0'
+ receive '\0'
+
+then everything is fine. However, if the client wins the race:
+
+ client server
+ connect
+ accept
+ send '\0'
+ set SO_PASSCRED = 1
+ receive '\0'
+
+then the kernel does not record credentials for the message containing
+'\0' (because SO_PASSCRED was 0 at the time). However, by the time the
+server receives the message, the kernel knows that credentials are
+desired. I would have expected the kernel to omit the credentials header
+in this case, but it seems that instead, it synthesizes a credentials
+structure with a dummy process ID 0, a dummy uid derived from
+/proc/sys/kernel/overflowuid and a dummy gid derived from
+/proc/sys/kernel/overflowgid.
+
+In an unconfigured GDBusServer, hitting this race condition results in
+falling back to DBUS_COOKIE_SHA1 authentication, which in practice usually
+succeeds in authenticating the peer's uid. However, we encourage AF_UNIX
+servers on Unix platforms to allow only EXTERNAL authentication as a
+security-hardening measure, because DBUS_COOKIE_SHA1 relies on a series
+of assumptions including a cryptographically strong PRNG and a shared
+home directory with no write access by others, which are not necessarily
+true for all operating systems and users. EXTERNAL authentication will
+fail if the server cannot determine the client's credentials.
+
+In particular, this caused a regression when CVE-2019-14822 was fixed
+in ibus, which appears to be resolved by this commit. Qt clients
+(which use libdbus) intermittently fail to connect to an ibus server
+(which uses GDBusServer), because ibus no longer allows DBUS_COOKIE_SHA1
+authentication or non-matching uids.
+
+Signed-off-by: Simon McVittie <smcv@collabora.com>
+Bug: https://gitlab.gnome.org/GNOME/glib/issues/1831
+Origin: upstream, 2.62.3, commit:c7618cce3752e1f3681f75d0a26c7e07c15bd6a2
+---
+ gio/gcredentialsprivate.h | 18 ++++++++++++++++++
+ gio/gdbusauth.c | 27 +++++++++++++++++++++++++--
+ 2 files changed, 43 insertions(+), 2 deletions(-)
+
+diff --git a/gio/gcredentialsprivate.h b/gio/gcredentialsprivate.h
+index 4d1c420..a4aa463 100644
+--- a/gio/gcredentialsprivate.h
++++ b/gio/gcredentialsprivate.h
+@@ -22,6 +22,18 @@
+ #include "gio/gcredentials.h"
+ #include "gio/gnetworking.h"
+
++/*
++ * G_CREDENTIALS_PREFER_MESSAGE_PASSING:
++ *
++ * Defined to 1 if the data structure transferred by the message-passing
++ * API is strictly more informative than the one transferred by the
++ * `getsockopt()`-style API, and hence should be preferred, even for
++ * protocols like D-Bus that are defined in terms of the credentials of
++ * the (process that opened the) socket, as opposed to the credentials
++ * of an individual message.
++ */
++#undef G_CREDENTIALS_PREFER_MESSAGE_PASSING
++
+ #ifdef __linux__
+ #define G_CREDENTIALS_SUPPORTED 1
+ #define G_CREDENTIALS_USE_LINUX_UCRED 1
+@@ -41,6 +53,12 @@
+ #define G_CREDENTIALS_NATIVE_SIZE (sizeof (struct cmsgcred))
+ #define G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1
+ #define G_CREDENTIALS_SPOOFING_SUPPORTED 1
++/* GLib doesn't implement it yet, but FreeBSD's getsockopt()-style API
++ * is getpeereid(), which is not as informative as struct cmsgcred -
++ * it does not tell us the PID. As a result, libdbus prefers to use
++ * SCM_CREDS, and if we implement getpeereid() in future, we should
++ * do the same. */
++#define G_CREDENTIALS_PREFER_MESSAGE_PASSING 1
+
+ #elif defined(__NetBSD__)
+ #define G_CREDENTIALS_SUPPORTED 1
+diff --git a/gio/gdbusauth.c b/gio/gdbusauth.c
+index 1f8ea80..b4d92c0 100644
+--- a/gio/gdbusauth.c
++++ b/gio/gdbusauth.c
+@@ -31,6 +31,7 @@
+ #include "gdbusutils.h"
+ #include "gioenumtypes.h"
+ #include "gcredentials.h"
++#include "gcredentialsprivate.h"
+ #include "gdbusprivate.h"
+ #include "giostream.h"
+ #include "gdatainputstream.h"
+@@ -969,9 +970,31 @@ _g_dbus_auth_run_server (GDBusAuth *auth,
+
+ g_data_input_stream_set_newline_type (dis, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
+
+- /* first read the NUL-byte */
++ /* read the NUL-byte, possibly with credentials attached */
+ #ifdef G_OS_UNIX
+- if (G_IS_UNIX_CONNECTION (auth->priv->stream))
++#ifndef G_CREDENTIALS_PREFER_MESSAGE_PASSING
++ if (G_IS_SOCKET_CONNECTION (auth->priv->stream))
++ {
++ GSocket *sock = g_socket_connection_get_socket (G_SOCKET_CONNECTION (auth->priv->stream));
++
++ local_error = NULL;
++ credentials = g_socket_get_credentials (sock, &local_error);
++
++ if (credentials == NULL && !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED))
++ {
++ g_propagate_error (error, local_error);
++ goto out;
++ }
++ else
++ {
++ /* Clear the error indicator, so we can retry with
++ * g_unix_connection_receive_credentials() if necessary */
++ g_clear_error (&local_error);
++ }
++ }
++#endif
++
++ if (credentials == NULL && G_IS_UNIX_CONNECTION (auth->priv->stream))
+ {
+ local_error = NULL;
+ credentials = g_unix_connection_receive_credentials (G_UNIX_CONNECTION (auth->priv->stream),
diff -Nru glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Create-temporary-directory-for-Uni.patch glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Create-temporary-directory-for-Uni.patch
--- glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Create-temporary-directory-for-Uni.patch 1970-01-01 01:00:00.000000000 +0100
+++ glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Create-temporary-directory-for-Uni.patch 2019-11-06 08:29:15.000000000 +0000
@@ -0,0 +1,191 @@
+From: Simon McVittie <smcv@collabora.com>
+Date: Tue, 29 Oct 2019 16:27:53 +0000
+Subject: gdbus-server-auth test: Create temporary directory for Unix socket
+
+This avoids failure to listen on the given address on non-Linux Unix
+kernels, where abstract sockets do not exist and so unix:tmpdir is
+equivalent to unix:dir.
+
+Unlike the corresponding commit in GLib 2.63.1, this backport continues
+to use unix:tmpdir addresses on Linux kernels, because GLib didn't
+implement unix:dir until version 2.61.2.
+
+Bug: GNOME/glib#1920
+Fixes: 9f962ebe "Add a test for GDBusServer authentication"
+Signed-off-by: Simon McVittie <smcv@collabora.com>
+Origin: backport, 2.63.1, commit:2b1e706b2f0007982f4fe6a70734d4490e4093a3
+---
+ gio/tests/gdbus-server-auth.c | 76 +++++++++++++++++++++++++++----------------
+ 1 file changed, 48 insertions(+), 28 deletions(-)
+
+diff --git a/gio/tests/gdbus-server-auth.c b/gio/tests/gdbus-server-auth.c
+index 6a72ba6..95b1e37 100644
+--- a/gio/tests/gdbus-server-auth.c
++++ b/gio/tests/gdbus-server-auth.c
+@@ -17,6 +17,9 @@
+
+ #include "config.h"
+
++#include <errno.h>
++
++#include <glib/gstdio.h>
+ #include <gio/gio.h>
+
+ #ifdef HAVE_DBUS1
+@@ -245,18 +248,19 @@ assert_expected_uid_pid (InteropFlags flags,
+ }
+
+ static void
+-do_test_server_auth (const char *listenable_address,
+- InteropFlags flags)
++do_test_server_auth (InteropFlags flags)
+ {
+ GError *error = NULL;
+- GDBusServer *server;
+- GDBusAuthObserver *observer;
++ gchar *tmpdir = NULL;
++ gchar *listenable_address = NULL;
++ GDBusServer *server = NULL;
++ GDBusAuthObserver *observer = NULL;
+ GDBusServerFlags server_flags = G_DBUS_SERVER_FLAGS_RUN_IN_THREAD;
+- gchar *guid;
++ gchar *guid = NULL;
+ const char *connectable_address;
+- GDBusConnection *client;
++ GDBusConnection *client = NULL;
+ GAsyncResult *result = NULL;
+- GVariant *tuple;
++ GVariant *tuple = NULL;
+ gint64 uid, pid;
+ #ifdef HAVE_DBUS1
+ /* GNOME/glib#1831 seems to involve a race condition, so try a few times
+@@ -265,11 +269,25 @@ do_test_server_auth (const char *listenable_address,
+ gsize n = 20;
+ #endif
+
+- if (g_str_has_prefix (listenable_address, "tcp:") ||
+- g_str_has_prefix (listenable_address, "nonce-tcp:"))
+- g_assert_cmpint (flags & INTEROP_FLAGS_TCP, !=, 0);
++ if (flags & INTEROP_FLAGS_TCP)
++ {
++ listenable_address = g_strdup ("tcp:host=127.0.0.1");
++ }
+ else
+- g_assert_cmpint (flags & INTEROP_FLAGS_TCP, ==, 0);
++ {
++#ifdef G_OS_UNIX
++ gchar *escaped;
++
++ tmpdir = g_dir_make_tmp ("gdbus-server-auth-XXXXXX", &error);
++ g_assert_no_error (error);
++ escaped = g_dbus_address_escape_value (tmpdir);
++ listenable_address = g_strdup_printf ("unix:tmpdir=%s", escaped);
++ g_free (escaped);
++#else
++ g_test_skip ("unix: addresses only work on Unix");
++ goto out;
++#endif
++ }
+
+ g_test_message ("Testing GDBus server at %s / libdbus client, with flags: "
+ "external:%s "
+@@ -282,20 +300,12 @@ do_test_server_auth (const char *listenable_address,
+ (flags & INTEROP_FLAGS_SHA1) ? "true" : "false",
+ (flags & INTEROP_FLAGS_TCP) ? "true" : "false");
+
+-#ifndef G_OS_UNIX
+- if (g_str_has_prefix (listenable_address, "unix:"))
+- {
+- g_test_skip ("unix: addresses only work on Unix");
+- return;
+- }
+-#endif
+-
+ #if !defined(G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED) \
+ && !defined(G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED)
+ if (flags & INTEROP_FLAGS_EXTERNAL)
+ {
+ g_test_skip ("EXTERNAL authentication not implemented on this platform");
+- return;
++ goto out;
+ }
+ #endif
+
+@@ -333,6 +343,7 @@ do_test_server_auth (const char *listenable_address,
+ g_signal_connect (server, "new-connection", G_CALLBACK (new_connection_cb), NULL);
+ g_dbus_server_start (server);
+ connectable_address = g_dbus_server_get_client_address (server);
++ g_test_message ("Connectable address: %s", connectable_address);
+
+ result = NULL;
+ g_dbus_connection_new_for_address (connectable_address,
+@@ -425,52 +436,61 @@ do_test_server_auth (const char *listenable_address,
+ g_test_skip ("Testing interop with libdbus not supported");
+ #endif /* !HAVE_DBUS1 */
+
+- g_dbus_server_stop (server);
++out:
++ if (server != NULL)
++ g_dbus_server_stop (server);
++
++ if (tmpdir != NULL)
++ g_assert_cmpstr (g_rmdir (tmpdir) == 0 ? "OK" : g_strerror (errno),
++ ==, "OK");
++
+ g_clear_object (&server);
+ g_clear_object (&observer);
+ g_free (guid);
++ g_free (listenable_address);
++ g_free (tmpdir);
+ }
+
+ static void
+ test_server_auth (void)
+ {
+- do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_NONE);
++ do_test_server_auth (INTEROP_FLAGS_NONE);
+ }
+
+ static void
+ test_server_auth_tcp (void)
+ {
+- do_test_server_auth ("tcp:host=127.0.0.1", INTEROP_FLAGS_TCP);
++ do_test_server_auth (INTEROP_FLAGS_TCP);
+ }
+
+ static void
+ test_server_auth_anonymous (void)
+ {
+- do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_ANONYMOUS);
++ do_test_server_auth (INTEROP_FLAGS_ANONYMOUS);
+ }
+
+ static void
+ test_server_auth_anonymous_tcp (void)
+ {
+- do_test_server_auth ("tcp:host=127.0.0.1", INTEROP_FLAGS_ANONYMOUS | INTEROP_FLAGS_TCP);
++ do_test_server_auth (INTEROP_FLAGS_ANONYMOUS | INTEROP_FLAGS_TCP);
+ }
+
+ static void
+ test_server_auth_external (void)
+ {
+- do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_EXTERNAL);
++ do_test_server_auth (INTEROP_FLAGS_EXTERNAL);
+ }
+
+ static void
+ test_server_auth_sha1 (void)
+ {
+- do_test_server_auth ("unix:tmpdir=/tmp/gdbus-test", INTEROP_FLAGS_SHA1);
++ do_test_server_auth (INTEROP_FLAGS_SHA1);
+ }
+
+ static void
+ test_server_auth_sha1_tcp (void)
+ {
+- do_test_server_auth ("tcp:host=127.0.0.1", INTEROP_FLAGS_SHA1 | INTEROP_FLAGS_TCP);
++ do_test_server_auth (INTEROP_FLAGS_SHA1 | INTEROP_FLAGS_TCP);
+ }
+
+ int
diff -Nru glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Include-gcredentialsprivate.h.patch glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Include-gcredentialsprivate.h.patch
--- glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Include-gcredentialsprivate.h.patch 1970-01-01 01:00:00.000000000 +0100
+++ glib2.0-2.58.3/debian/patches/gdbus-server-auth-test-Include-gcredentialsprivate.h.patch 2019-11-06 08:29:15.000000000 +0000
@@ -0,0 +1,41 @@
+From: Simon McVittie <smcv@collabora.com>
+Date: Mon, 4 Nov 2019 10:21:51 +0000
+Subject: gdbus-server-auth test: Include gcredentialsprivate.h
+
+Otherwise we'll never test the EXTERNAL-only mode, because that relies
+on testing the private macros
+G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED and
+G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED.
+
+Fixes: 9f962ebe "Add a test for GDBusServer authentication"
+Signed-off-by: Simon McVittie <smcv@collabora.com>
+Applied-upstream: 2.63.2, commit:49eccfbe709e73932048ab88cf905798b708222a
+---
+ gio/tests/gdbus-server-auth.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/gio/tests/gdbus-server-auth.c b/gio/tests/gdbus-server-auth.c
+index 95b1e37..a683965 100644
+--- a/gio/tests/gdbus-server-auth.c
++++ b/gio/tests/gdbus-server-auth.c
+@@ -22,6 +22,9 @@
+ #include <glib/gstdio.h>
+ #include <gio/gio.h>
+
++/* For G_CREDENTIALS_*_SUPPORTED */
++#include <gio/gcredentialsprivate.h>
++
+ #ifdef HAVE_DBUS1
+ #include <dbus/dbus.h>
+ #endif
+@@ -436,6 +439,10 @@ do_test_server_auth (InteropFlags flags)
+ g_test_skip ("Testing interop with libdbus not supported");
+ #endif /* !HAVE_DBUS1 */
+
++ /* No practical effect, just to avoid -Wunused-label under some
++ * combinations of #ifdefs */
++ goto out;
++
+ out:
+ if (server != NULL)
+ g_dbus_server_stop (server);
diff -Nru glib2.0-2.58.3/debian/patches/series glib2.0-2.58.3/debian/patches/series
--- glib2.0-2.58.3/debian/patches/series 2019-07-30 10:41:51.000000000 +0100
+++ glib2.0-2.58.3/debian/patches/series 2019-11-06 08:29:15.000000000 +0000
@@ -3,6 +3,11 @@
closures-test-Avoid-timeout-on-ARM64-CPUs.patch
gfile-Limit-access-to-files-when-copying.patch
keyfile-settings-Use-tighter-permissions.patch
+credentials-Invalid-Linux-struct-ucred-means-no-informati.patch
+GDBus-prefer-getsockopt-style-credentials-passing-APIs.patch
+Add-a-test-for-GDBusServer-authentication.patch
+gdbus-server-auth-test-Create-temporary-directory-for-Uni.patch
+gdbus-server-auth-test-Include-gcredentialsprivate.h.patch
01_gettext-desktopfiles.patch
81-skip-monitor-test-on-non-linux.patch
0001-timer-test-use-volatile-for-locals.patch
Reply to: