From 99919d49c0ff926bc014d1eb3bf72e2006b567d4 Mon Sep 17 00:00:00 2001 From: Michael Weiser Date: Mon, 28 Feb 2022 20:18:28 +0100 Subject: [PATCH] swaybar/tray: Prevent null pointer dereference This change prevents swaybar from crashing when trying to open the context menu of a StatusNotifierItem. Observed with blueman-applet. The backtrace is: Program terminated with signal SIGSEGV, Segmentation fault. #0 0x000055fa7472b150 in dbusmenu_menu_find_menu_surface (menu=0x0, surface=0x55fa74d290d0) at ../sway-1.7/swaybar/tray/dbusmenu.c:1203 1203 if (menu->surface && menu->surface->surface == surface) { (gdb) bt #0 0x000055fa7472b150 in dbusmenu_menu_find_menu_surface (menu=0x0, surface=0x55fa74d290d0) at ../sway-1.7/swaybar/tray/dbusmenu.c:1203 #1 0x000055fa7472b4a3 in dbusmenu_pointer_enter (data=0x55fa74d28310, wl_pointer=0x55fa74d22e10, serial=348969, surface=0x55fa74d290d0, surface_x=365306, surface_y=6803) at ../sway-1.7/swaybar/tray/dbusmenu.c:1278 #2 0x000055fa747192eb in wl_pointer_enter (data=0x55fa74d28310, wl_pointer=0x55fa74d22e10, serial=348969, surface=0x55fa74d290d0, surface_x=365306, surface_y=6803) at ../sway-1.7/swaybar/input.c:121 #3 0x00007f9eced29e1a in () at /usr/lib64/libffi.so.8 #4 0x00007f9eced2937c in () at /usr/lib64/libffi.so.8 #5 0x00007f9ecf6da4c1 in () at /usr/lib64/libwayland-client.so.0 #6 0x00007f9ecf6d6a0a in () at /usr/lib64/libwayland-client.so.0 #7 0x00007f9ecf6d832c in wl_display_dispatch_queue_pending () at /usr/lib64/libwayland-client.so.0 #8 0x00007f9ecf6d884f in wl_display_roundtrip_queue () at /usr/lib64/libwayland-client.so.0 #9 0x000055fa7472acc8 in swaybar_dbusmenu_create (sni=0x55fa74e05590, output=0x55fa74d28d60, seat=0x55fa74d28310, serial=348944, x=5230, y=1100) at ../sway-1.7/swaybar/tray/dbusmenu.c:1107 #10 0x000055fa74724de8 in handle_click (sni=0x55fa74e05590, output=0x55fa74d28d60, seat=0x55fa74d28310, serial=348944, x=5230, y=1100, button=273, delta=1) at ../sway-1.7/swaybar/tray/item.c:379 #11 0x000055fa74725137 in icon_hotspot_callback (output=0x55fa74d28d60, hotspot=0x55fa74db12f0, seat=0x55fa74d28310, serial=348944, x=1390.921875, y=20.99609375, button=273, data=0x55fa74f33e40) at ../sway-1.7/swaybar/tray/item.c:423 #12 0x000055fa74719555 in process_hotspots (output=0x55fa74d28d60, seat=0x55fa74d28310, serial=348944, x=1390.921875, y=20.99609375, button=273) at ../sway-1.7/swaybar/input.c:175 #13 0x000055fa74719693 in wl_pointer_button (data=0x55fa74d28310, wl_pointer=0x55fa74d22e10, serial=348944, time=1003868332, button=273, state=1) at ../sway-1.7/swaybar/input.c:207 #14 0x00007f9eced29e1a in () at /usr/lib64/libffi.so.8 #15 0x00007f9eced2937c in () at /usr/lib64/libffi.so.8 #16 0x00007f9ecf6da4c1 in () at /usr/lib64/libwayland-client.so.0 #17 0x00007f9ecf6d6a0a in () at /usr/lib64/libwayland-client.so.0 #18 0x00007f9ecf6d832c in wl_display_dispatch_queue_pending () at /usr/lib64/libwayland-client.so.0 #19 0x000055fa74716aa9 in display_in (fd=136, mask=1, data=0x55fa7473ba40 ) at ../sway-1.7/swaybar/bar.c:470 #20 0x000055fa7472d414 in loop_poll (loop=0x55fa74d20fd0) at ../sway-1.7/common/loop.c:84 #21 0x000055fa74716d52 in bar_run (bar=0x55fa7473ba40 ) at ../sway-1.7/swaybar/bar.c:519 #22 0x000055fa7471cec2 in main (argc=3, argv=0x7fff4c24db38) at ../sway-1.7/swaybar/main.c:101 --- swaybar/tray/dbusmenu.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/swaybar/tray/dbusmenu.c b/swaybar/tray/dbusmenu.c index e4a6a9f6d6..360b4b2dd8 100644 --- a/swaybar/tray/dbusmenu.c +++ b/swaybar/tray/dbusmenu.c @@ -1199,6 +1199,9 @@ bool dbusmenu_pointer_motion(struct swaybar_seat *seat, static struct swaybar_dbusmenu_menu *dbusmenu_menu_find_menu_surface( struct swaybar_dbusmenu_menu *menu, struct wl_surface *surface) { + if (!menu) { + return NULL; + } if (menu->surface && menu->surface->surface == surface) { return menu;