[gtk2] Do not abort when releasing an unlocked mutex

Kalev Lember kalev at fedoraproject.org
Thu Sep 4 11:27:24 UTC 2014


commit f4771315d217244e6d1e7dd3fb31895d0a0aa304
Author: Kalev Lember <kalevlember at gmail.com>
Date:   Thu Sep 4 13:23:07 2014 +0200

    Do not abort when releasing an unlocked mutex
    
    Backport an upstream fix to avoid triggering abort() from F21 glib2 when
    releasing a mutex that hasn't been locked yet.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=1138146

 ...not-release-the-GDK-lock-if-it-hasn-t-bee.patch |   88 ++++++++++++++++++++
 gtk2.spec                                          |    7 ++-
 2 files changed, 94 insertions(+), 1 deletions(-)
---
diff --git a/0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch b/0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch
new file mode 100644
index 0000000..c4fa6df
--- /dev/null
+++ b/0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch
@@ -0,0 +1,88 @@
+From fbf38d16bcc26630f0f721d266509f5bc292f606 Mon Sep 17 00:00:00 2001
+From: Emmanuele Bassi <ebassi at gnome.org>
+Date: Tue, 26 Aug 2014 12:07:34 +0100
+Subject: [PATCH] threads: Do not release the GDK lock if it hasn't been
+ acquired yet
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Since GLib ≥ 2.41, attempting to release an unlocked mutex will abort(),
+as it happens on most systems already.
+
+Given the lack of proper documentation on how to use GDK with threads,
+there is code in the wild that does:
+
+    gdk_threads_init ();
+    gdk_init ();
+
+    ...
+
+    gtk_main ();
+
+instead of the idiomatically correct:
+
+    gdk_threads_init ();
+    gdk_threads_enter ();
+
+    gtk_init ();
+
+    ...
+
+    gtk_main ();
+
+    ...
+
+    gdk_threads_leave ();
+
+Which means that gtk_main() will try to release the GDK lock, and thus
+trigger an error from GLib.
+
+we cannot really fix all the wrong code everywhere, and since it does
+not cost us anything, we can work around the issue inside GDK itself, by
+trying to acquire the GDK lock inside gdk_threads_leave() with
+trylock().
+
+https://bugzilla.gnome.org/show_bug.cgi?id=735428
+---
+ gdk/gdk.c | 24 +++++++++++++++++++++++-
+ 1 file changed, 23 insertions(+), 1 deletion(-)
+
+diff --git a/gdk/gdk.c b/gdk/gdk.c
+index 0106d8a..f722dbf 100644
+--- a/gdk/gdk.c
++++ b/gdk/gdk.c
+@@ -434,7 +434,29 @@ static void
+ gdk_threads_impl_unlock (void)
+ {
+   if (gdk_threads_mutex)
+-    g_mutex_unlock (gdk_threads_mutex);
++    {
++      /* we need a trylock() here because trying to unlock a mutex
++       * that hasn't been locked yet is:
++       *
++       *  a) not portable
++       *  b) fail on GLib ≥ 2.41
++       *
++       * trylock() will either succeed because nothing is holding the
++       * GDK mutex, and will be unlocked right afterwards; or it's
++       * going to fail because the mutex is locked already, in which
++       * case we unlock it as expected.
++       *
++       * this is needed in the case somebody called gdk_threads_init()
++       * without calling gdk_threads_enter() before calling gtk_main().
++       * in theory, we could just say that this is undefined behaviour,
++       * but our documentation has always been *less* than explicit as
++       * to what the behaviour should actually be.
++       *
++       * see bug: https://bugzilla.gnome.org/show_bug.cgi?id=735428
++       */
++      g_mutex_trylock (gdk_threads_mutex);
++      g_mutex_unlock (gdk_threads_mutex);
++    }
+ }
+ 
+ /**
+-- 
+2.1.0
+
diff --git a/gtk2.spec b/gtk2.spec
index 3657130..40f8abf 100644
--- a/gtk2.spec
+++ b/gtk2.spec
@@ -18,7 +18,7 @@
 Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X
 Name: gtk2
 Version: 2.24.24
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: LGPLv2+
 Group: System Environment/Libraries
 URL: http://www.gtk.org
@@ -35,6 +35,7 @@ Patch2: icon-padding.patch
 Patch8: tooltip-positioning.patch
 # https://bugzilla.gnome.org/show_bug.cgi?id=611313
 Patch15: window-dragging.patch
+Patch16: 0001-threads-Do-not-release-the-GDK-lock-if-it-hasn-t-bee.patch
 
 BuildRequires: atk-devel >= %{atk_version}
 BuildRequires: glib2-devel >= %{glib2_version}
@@ -146,6 +147,7 @@ This package contains developer documentation for the GTK+ widget toolkit.
 %patch2 -p1 -b .icon-padding
 %patch8 -p1 -b .tooltip-positioning
 %patch15 -p1 -b .window-dragging
+%patch16 -p1 -b .trylock
 
 %build
 (if ! test -x configure; then NOCONFIGURE=1 ./autogen.sh; CONFIGFLAGS=--enable-gtk-doc; fi;
@@ -335,6 +337,9 @@ gtk-query-immodules-2.0-%{__isa_bits} --update-cache
 %doc tmpdocs/examples
 
 %changelog
+* Thu Sep 04 2014 Kalev Lember <kalevlember at gmail.com> - 2.24.24-3
+- Do not abort when releasing an unlocked mutex (#1138146)
+
 * Sat Aug 16 2014 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 2.24.24-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
 


More information about the scm-commits mailing list