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.
This commit is contained in:
parent
6780073d78
commit
00db2ee5ff
@ -551,6 +551,16 @@ weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *ev
|
||||
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 @@ weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *eve
|
||||
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 @@ weston_wm_window_transform(struct wl_listener *listener, void *data)
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user