git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit6866eba796a8c37e181dd9448e3e6cc747ad8c9e
parenta6bf61b0ef
authorLucas Galante <[email protected]>
date2026-06-18 19:06
fix: prevent segfault in layer shell when output is destroyed

 src/server/layer_shell.rs | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/src/server/layer_shell.rs b/src/server/layer_shell.rs
index b114657..ef38c6a 100644
--- a/src/server/layer_shell.rs
+++ b/src/server/layer_shell.rs
@@ -480,8 +480,13 @@ unsafe extern "C" fn handle_layer_surface_map(listener: *mut ffi::wl_listener, _
         }
     }
 
-    let output = ffi::river_wlr_output_get_data((*wlr_layer_surface).output) as *mut Output;
-    (*output).layer_shell.arrange(output);
+    let wlr_output = (*wlr_layer_surface).output;
+    if !wlr_output.is_null() {
+        let output = ffi::river_wlr_output_get_data(wlr_output) as *mut Output;
+        if !output.is_null() {
+            (*output).layer_shell.arrange(output);
+        }
+    }
     (*server).layer_shell.check_exclusive_focus();
     (*server).wm.dirty_windowing();
 }
@@ -518,8 +523,13 @@ unsafe extern "C" fn handle_layer_surface_unmap(listener: *mut ffi::wl_listener,
         curr = next;
     }
 
-    let output = ffi::river_wlr_output_get_data((*wlr_layer_surface).output) as *mut Output;
-    (*output).layer_shell.arrange(output);
+    let wlr_output = (*wlr_layer_surface).output;
+    if !wlr_output.is_null() {
+        let output = ffi::river_wlr_output_get_data(wlr_output) as *mut Output;
+        if !output.is_null() {
+            (*output).layer_shell.arrange(output);
+        }
+    }
     (*server).layer_shell.check_exclusive_focus();
     (*server).wm.dirty_windowing();
 }
@@ -542,7 +552,14 @@ unsafe extern "C" fn handle_layer_surface_commit(listener: *mut ffi::wl_listener
         );
     }
 
-    assert!(!(*wlr_layer_surface).output.is_null());
+    let wlr_output = (*wlr_layer_surface).output;
+    if wlr_output.is_null() {
+        return;
+    }
+    let output = ffi::river_wlr_output_get_data(wlr_output) as *mut Output;
+    if output.is_null() {
+        return;
+    }
 
     let server = (*layer_surface).server;
 
@@ -556,7 +573,6 @@ unsafe extern "C" fn handle_layer_surface_commit(listener: *mut ffi::wl_listener
     }
 
     if (*wlr_layer_surface).initial_commit || ((*wlr_layer_surface).current.committed != 0) {
-        let output = ffi::river_wlr_output_get_data((*wlr_layer_surface).output) as *mut Output;
         (*output).layer_shell.arrange(output);
         (*server).layer_shell.check_exclusive_focus();
         (*server).wm.dirty_windowing();