mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2025-12-21 14:30:12 +01:00
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
1 changed files with 15 additions and 14 deletions
|
|
@ -551,6 +551,16 @@ weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *ev
|
||||||
weston_wm_window_schedule_repaint(window);
|
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
|
static void
|
||||||
weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *event)
|
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;
|
struct weston_wm_window *window;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
window = hash_table_lookup(wm->window_hash, configure_notify->window);
|
wm_log("XCB_CONFIGURE_NOTIFY (window %d) %d,%d @ %dx%d\n",
|
||||||
|
|
||||||
wm_log("XCB_CONFIGURE_NOTIFY (%s window %d) %d,%d @ %dx%d\n",
|
|
||||||
configure_notify->window == window->id ? "client" : "frame",
|
|
||||||
configure_notify->window,
|
configure_notify->window,
|
||||||
configure_notify->x, configure_notify->y,
|
configure_notify->x, configure_notify->y,
|
||||||
configure_notify->width, configure_notify->height);
|
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 */
|
/* resize falls here */
|
||||||
if (configure_notify->window != window->id)
|
if (configure_notify->window != window->id)
|
||||||
return;
|
return;
|
||||||
|
|
@ -671,16 +682,6 @@ weston_wm_window_transform(struct wl_listener *listener, void *data)
|
||||||
old_sy = sy;
|
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_WITHDRAWN_STATE 0
|
||||||
#define ICCCM_NORMAL_STATE 1
|
#define ICCCM_NORMAL_STATE 1
|
||||||
#define ICCCM_ICONIC_STATE 3
|
#define ICCCM_ICONIC_STATE 3
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue