xwayland: Don't crash when we get configure notify for destroyed frame windows
We can get a destroy notify for the frame window after we've removed it
from the hash table. This turns into a NULL pointer deref when we look up
the window and try to use it for debugging printout.
Fixes the failing xwayland test case.
diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index e39ce0a..b989183 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -551,6 +551,16 @@
weston_wm_window_schedule_repaint(window);
}
+static int
+our_resource(struct weston_wm *wm, uint32_t id)
+{
+ const xcb_setup_t *setup;
+
+ setup = xcb_get_setup(wm->conn);
+
+ return (id & ~setup->resource_id_mask) == setup->resource_id_base;
+}
+
static void
weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *event)
{
@@ -559,14 +569,15 @@
struct weston_wm_window *window;
int x, y;
- window = hash_table_lookup(wm->window_hash, configure_notify->window);
-
- wm_log("XCB_CONFIGURE_NOTIFY (%s window %d) %d,%d @ %dx%d\n",
- configure_notify->window == window->id ? "client" : "frame",
+ wm_log("XCB_CONFIGURE_NOTIFY (window %d) %d,%d @ %dx%d\n",
configure_notify->window,
configure_notify->x, configure_notify->y,
configure_notify->width, configure_notify->height);
+ if (our_resource(wm, configure_notify->window))
+ return;
+
+ window = hash_table_lookup(wm->window_hash, configure_notify->window);
/* resize falls here */
if (configure_notify->window != window->id)
return;
@@ -671,16 +682,6 @@
old_sy = sy;
}
-static int
-our_resource(struct weston_wm *wm, uint32_t id)
-{
- const xcb_setup_t *setup;
-
- setup = xcb_get_setup(wm->conn);
-
- return (id & ~setup->resource_id_mask) == setup->resource_id_base;
-}
-
#define ICCCM_WITHDRAWN_STATE 0
#define ICCCM_NORMAL_STATE 1
#define ICCCM_ICONIC_STATE 3