[PATCH weston] window: Fix crash in input_set_pointer_image when cursor is special

Pekka Paalanen ppaalanen at gmail.com
Thu Mar 5 00:15:45 PST 2015


On Wed,  4 Mar 2015 16:26:25 -0600
Derek Foreman <derekf at osg.samsung.com> wrote:

> Certain circumstances may lead to the "force" clause in
> input_set_pointer_image() being reached when the current cursor
> is blank or unset.  These are special cursors that don't have
> images, and they need to be handled differently than image cursors.
> 
> This patch puts the special cursor handling in its own function and calls
> it from both places that need it.  Previously only the frame callback
> handler did this correctly.
> 
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>  clients/window.c | 27 +++++++++++++++++++--------
>  1 file changed, 19 insertions(+), 8 deletions(-)
> 
> diff --git a/clients/window.c b/clients/window.c
> index a04cef9..1399fa4 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -38,6 +38,7 @@
>  #include <sys/mman.h>
>  #include <sys/epoll.h>
>  #include <sys/timerfd.h>
> +#include <stdbool.h>
>  
>  #ifdef HAVE_CAIRO_EGL
>  #include <wayland-egl.h>
> @@ -3524,6 +3525,22 @@ input_set_pointer_image_index(struct input *input, int index)
>  
>  static const struct wl_callback_listener pointer_surface_listener;
>  
> +static bool
> +input_set_pointer_special(struct input *input)
> +{
> +	if (input->current_cursor == CURSOR_BLANK) {
> +		wl_pointer_set_cursor(input->pointer,
> +				      input->pointer_enter_serial,
> +				      NULL, 0, 0);
> +		return true;
> +	}
> +
> +	if (input->current_cursor == CURSOR_UNSET)
> +		return true;
> +
> +	return false;
> +}
> +
>  static void
>  pointer_surface_frame_callback(void *data, struct wl_callback *callback,
>  			       uint32_t time)
> @@ -3541,15 +3558,9 @@ pointer_surface_frame_callback(void *data, struct wl_callback *callback,
>  	if (!input->pointer)
>  		return;
>  
> -	if (input->current_cursor == CURSOR_BLANK) {
> -		wl_pointer_set_cursor(input->pointer,
> -				      input->pointer_enter_serial,
> -				      NULL, 0, 0);
> +	if (input_set_pointer_special(input))
>  		return;
> -	}
>  
> -	if (input->current_cursor == CURSOR_UNSET)
> -		return;
>  	cursor = input->display->cursors[input->current_cursor];
>  	if (!cursor)
>  		return;
> @@ -3598,7 +3609,7 @@ input_set_pointer_image(struct input *input, int pointer)
>  	input->cursor_serial = input->pointer_enter_serial;
>  	if (!input->cursor_frame_cb)
>  		pointer_surface_frame_callback(input, NULL, 0);
> -	else if (force) {
> +	else if (force && !input_set_pointer_special(input)) {
>  		/* The current frame callback may be stuck if, for instance,
>  		 * the set cursor request was processed by the server after
>  		 * this client lost the focus. In this case the cursor surface

I can certainly see how calling input_set_pointer_image_index() with a
non-image cursor would not do what was intended, as far as I can
understand.

R-b me then.
   fa79b1d..493d979  master -> master

Would've been nice to how I could trigger the crash, but if it's
complicated, nevermind.


Thanks,
pq


More information about the wayland-devel mailing list