[v2,weston] compositor-x11: Fix some shutdown crashes

Submitted by Derek Foreman on Dec. 11, 2014, 9:44 p.m.

Details

Message ID 1418334286-30892-1-git-send-email-derekf@osg.samsung.com
State Accepted
Commit 99bfa6479902193b93a865030056ea98c2ee72a7
Headers show

Not browsing as part of any series.

Commit Message

Derek Foreman Dec. 11, 2014, 9:44 p.m.
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.

Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
---

Missed one in the first patch - not 100% sure it can actually trigger,
but should catch it for completeness, I think...

 src/compositor-x11.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index a760f33..29f2119 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
@@ -929,7 +929,8 @@  x11_compositor_delete_window(struct x11_compositor *c, xcb_window_t window)
 	struct x11_output *output;
 
 	output = x11_compositor_find_output(c, window);
-	x11_output_destroy(&output->base);
+	if (output)
+		x11_output_destroy(&output->base);
 
 	xcb_flush(c->conn);
 
@@ -992,6 +993,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 +1073,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 +1102,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 +1254,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;

Comments

On Thu, 11 Dec 2014 15:44:46 -0600
Derek Foreman <derekf@osg.samsung.com> 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.
> 
> Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
> ---
> 
> Missed one in the first patch - not 100% sure it can actually trigger,
> but should catch it for completeness, I think...
> 
>  src/compositor-x11.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)

Pushed, thanks,
pq