[PATCH weston] compositor-x11: Fix some shutdown crashes

Bryce Harrington bryce at osg.samsung.com
Thu Dec 11 12:25:22 PST 2014


On Thu, Dec 11, 2014 at 01:40:11PM -0600, Derek Foreman wrote:
> The assertion in x11_compositor_find_output() can trigger during normal
> shutdown, for example, when moving the mouse while hitting a hotkey to
> close the weston window.
> 
> Instead we can remove the assert(), return NULL, and discard events
> we can't find a destination output for.

LGTM.

Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>
 
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>  src/compositor-x11.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
> index a760f33..566df12 100644
> --- a/src/compositor-x11.c
> +++ b/src/compositor-x11.c
> @@ -920,7 +920,7 @@ x11_compositor_find_output(struct x11_compositor *c, xcb_window_t window)
>  			return output;
>  	}
>  
> -	assert(0);
> +	return NULL;
>  }
>  
>  static void
> @@ -992,6 +992,8 @@ x11_compositor_deliver_button_event(struct x11_compositor *c,
>  	struct x11_output *output;
>  
>  	output = x11_compositor_find_output(c, button_event->event);
> +	if (!output)
> +		return;
>  
>  	if (state)
>  		xcb_grab_pointer(c->conn, 0, output->window,
> @@ -1070,6 +1072,9 @@ x11_compositor_deliver_motion_event(struct x11_compositor *c,
>  	if (!c->has_xkb)
>  		update_xkb_state_from_core(c, motion_notify->state);
>  	output = x11_compositor_find_output(c, motion_notify->event);
> +	if (!output)
> +		return;
> +
>  	weston_output_transform_coordinate(&output->base,
>  					   wl_fixed_from_int(motion_notify->event_x),
>  					   wl_fixed_from_int(motion_notify->event_y),
> @@ -1096,6 +1101,9 @@ x11_compositor_deliver_enter_event(struct x11_compositor *c,
>  	if (!c->has_xkb)
>  		update_xkb_state_from_core(c, enter_notify->state);
>  	output = x11_compositor_find_output(c, enter_notify->event);
> +	if (!output)
> +		return;
> +
>  	weston_output_transform_coordinate(&output->base,
>  					   wl_fixed_from_int(enter_notify->event_x),
>  					   wl_fixed_from_int(enter_notify->event_y), &x, &y);
> @@ -1245,6 +1253,9 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
>  		case XCB_EXPOSE:
>  			expose = (xcb_expose_event_t *) event;
>  			output = x11_compositor_find_output(c, expose->window);
> +			if (!output)
> +				break;
> +
>  			weston_output_damage(&output->base);
>  			weston_output_schedule_repaint(&output->base);
>  			break;
> -- 
> 2.1.3
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list