Subject: [PATCH 1/2] gnu: openbox: Fix alt-tabbing crash

From: msglm <[email-masked]>
Date: Wed, 26 Mar 2025 03:03:27 -0500

Add patch to fix crashing when full screening and alt-tabbing.
Patch harvested from:
https://bugs.archlinux.org/attachments/77853/22501/0001-add-fix-for-glib2-exposed-segfault.patch

* gnu/packages/openbox.scm (openbox): New patch
* gnu/packages/patches/openbox-add-fix-for-glib2-exposed-segfault.patch: New File

Change-Id: I593b50bf14bdbeb300ea545ab9efe184651112fb
---
 gnu/packages/openbox.scm                      |  2 +-
 ...x-add-fix-for-glib2-exposed-segfault.patch | 50 +++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/openbox-add-fix-for-glib2-exposed-segfault.patch

diff --git a/gnu/packages/openbox.scm b/gnu/packages/openbox.scm
index 38afb9d9a0..85c3bda958 100644
--- a/gnu/packages/openbox.scm
+++ b/gnu/packages/openbox.scm
@@ -51,7 +51,7 @@ (define-public openbox
               (sha256
                (base32
                 "0vg2y1qddsdxkjv806mzpvmkgzliab8ll4s7zm7ma5jnriamirxb"))
-              (patches (search-patches "openbox-python3.patch"))))
+              (patches (search-patches "openbox-add-fix-for-glib2-exposed-segfault.patch" "openbox-python3.patch"))))
     (build-system gnu-build-system)
     (arguments
      (list #:phases
diff --git a/gnu/packages/patches/openbox-add-fix-for-glib2-exposed-segfault.patch b/gnu/packages/patches/openbox-add-fix-for-glib2-exposed-segfault.patch
new file mode 100644
index 0000000000..ef68d31213
--- /dev/null
+++ b/gnu/packages/patches/openbox-add-fix-for-glib2-exposed-segfault.patch
@@ -0,0 +1,50 @@
+From 9ed6fdd71890c5cc43747f105382d5677e5d37e7 Mon Sep 17 00:00:00 2001
+From: pldubouilh <[email-masked]>
+Date: Fri, 17 Mar 2023 18:23:47 +0100
+Subject: [PATCH] Fix list traversal issue in client_calc_layer
+
+The calls to client_calc_layer_internal can modify stacking_list, which
+can cause us to follow dangling ->next pointers (either by the pointer
+itself already being freed, or it pointing to a freed area). Avoid this
+by copying the list first, the goal is to visit every client in the list
+once so this should be fine.
+---
+ openbox/client.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/openbox/client.c b/openbox/client.c
+index 7168b2407..b8264587c 100644
+--- a/openbox/client.c
++++ b/openbox/client.c
+@@ -2742,9 +2742,12 @@ static void client_calc_layer_internal(ObClient *self)
+ void client_calc_layer(ObClient *self)
+ {
+     GList *it;
++    /* the client_calc_layer_internal calls below modify stacking_list,
++       so we have to make a copy to iterate over */
++    GList *list = g_list_copy(stacking_list);
+ 
+     /* skip over stuff above fullscreen layer */
+-    for (it = stacking_list; it; it = g_list_next(it))
++    for (it = list; it; it = g_list_next(it))
+         if (window_layer(it->data) <= OB_STACKING_LAYER_FULLSCREEN) break;
+ 
+     /* find the windows in the fullscreen layer, and mark them not-visited */
+@@ -2757,7 +2760,7 @@ void client_calc_layer(ObClient *self)
+     client_calc_layer_internal(self);
+ 
+     /* skip over stuff above fullscreen layer */
+-    for (it = stacking_list; it; it = g_list_next(it))
++    for (it = list; it; it = g_list_next(it))
+         if (window_layer(it->data) <= OB_STACKING_LAYER_FULLSCREEN) break;
+ 
+     /* now recalc any windows in the fullscreen layer which have not
+@@ -2768,6 +2771,8 @@ void client_calc_layer(ObClient *self)
+                  !WINDOW_AS_CLIENT(it->data)->visited)
+             client_calc_layer_internal(it->data);
+     }
++
++    g_list_free(it);
+ }
+ 
+ gboolean client_should_show(ObClient *self)

base-commit: 4d655e48836d5be89942a38da532431316f6887b
-- 
2.48.1