I have found a core file from gnome-shell in my home directory,
where gnome-shell got aborted by librthread because gnome-shell
was trying to lock the malloc mutex recursively.

What's happening here is that gnome-shell wants to print a gjs stack
trace when certain signals are caught, and sets up a signal handler
which uses stdio and malloc. This isn't safe. A correct approach would
be to print a stack dump from within the application's main loop after
a signal was caught. However, this main loop lives in mutter code, not
iin gnome-shell code. So the correct fix is a lot more involved than
the diff below and would likely require API changes in mutter to allow
gnome-shell to hook its handler at a suitable place.

For now, just disable this signal handler, which will always crash
on OpenBSD rather than producing stack trace information, to prevent
gnome-shell from littering home directories with useless core dumps.

ok?

Index: Makefile
===================================================================
RCS file: /cvs/ports/x11/gnome/shell/Makefile,v
retrieving revision 1.168
diff -u -p -r1.168 Makefile
--- Makefile    6 Mar 2019 08:29:36 -0000       1.168
+++ Makefile    25 Mar 2019 07:28:18 -0000
@@ -6,7 +6,7 @@ COMMENT=                next generation GNOME shell
 
 GNOME_PROJECT=         gnome-shell
 GNOME_VERSION=         3.30.2
-REVISION=              0
+REVISION=              1
 
 # GPLv2+
 PERMIT_PACKAGE_CDROM=  Yes
Index: patches/patch-src_main_c
===================================================================
RCS file: patches/patch-src_main_c
diff -N patches/patch-src_main_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_main_c    25 Mar 2019 07:28:46 -0000
@@ -0,0 +1,47 @@
+$OpenBSD$
+Disable broken signal handler which locks the malloc mutex recursively.
+
+#0  thrkill () at -:3
+#1  0x00000dc8de8ca89e in _libc_abort () at /usr/src/lib/libc/stdlib/abort.c:51
+#2  0x00000dc8de93cbba in _rthread_mutex_timedlock (mutexp=Variable "mutexp" 
is 
+not available.
+)
+    at /usr/src/lib/libc/thread/rthread_mutex.c:117
+#3  0x00000dc8de8adf12 in malloc (size=128)
+    at /usr/src/lib/libc/stdlib/malloc.c:1253
+#4  0x00000dc8de947746 in _libc_vasprintf (str=0xdc9b1be0b08, 
+    fmt=0xdc935649217 "== Stack trace for context %p ==\n", ap=0xdc9b1be0ce0)
+    at /usr/src/lib/libc/stdio/vasprintf.c:39
+#5  0x00000dc975b5cbbd in g_vasprintf (string=0xdc9b1be0b08, 
+    format=0xdc935649217 "== Stack trace for context %p ==\n", 
+    args=0xdc9b1be0ce0) at ../glib-2.58.3/glib/gprintf.c:330
+#6  0x00000dc975b13661 in g_strdup_vprintf (
+    format=0xdc935649217 "== Stack trace for context %p ==\n", 
+    args=0xdc9b1be0ce0) at ../glib-2.58.3/glib/gstrfuncs.c:514
+#7  0x00000dc975aef17f in g_printerr (
+    format=0xdc935649217 "== Stack trace for context %p ==\n")
+    at ../glib-2.58.3/glib/gmessages.c:3247
+#8  0x00000dc935781742 in gjs_context_print_stack_stderr ()
+   from /usr/local/lib/libgjs.so.5.0
+#9  0x00000dc9357817c5 in gjs_dumpstack () from /usr/local/lib/libgjs.so.5.0
+#10 0x00000dc6bd8b62f0 in dump_gjs_stack_on_signal_handler (signo=6)
+
+Index: src/main.c
+--- src/main.c.orig
++++ src/main.c
+@@ -348,6 +348,7 @@ dump_gjs_stack_on_signal_handler (int signo)
+ static void
+ dump_gjs_stack_on_signal (int signo)
+ {
++#if 0 /* this handler is disabled because it triggers malloc mutex recursion 
*/
+   struct sigaction sa = { 0 };
+ 
+   sa.sa_flags   = SA_RESETHAND | SA_NODEFER;
+@@ -356,6 +357,7 @@ dump_gjs_stack_on_signal (int signo)
+ 
+   sigaction (signo, &sa, NULL);
+   _tracked_signals[signo] = TRUE;
++#endif
+ }
+ 
+ static gboolean

Reply via email to