[PATCH wayland] client: Invoke new_id closure arguments as pointers instead of integers

Michael Hasselmann michaelh at openismus.com
Fri Mar 15 07:47:06 PDT 2013


Could we get this merged please? It fixes an annoying crasher bug for us
(see FDO#62367).

Thanks,
Michael

On Fri, 2013-03-08 at 18:44 +0100, Jonas Ådahl wrote:
> This commit adds a flags parameter to wl_closure_invoke(). The so far
> added flags are ment to specify if the invokation is client side or
> server side. When on the server side, closure arguments of type 'new_id'
> should be invoked as a integer id while on the client side they should
> be invoked as a pointer to a proxy object.
> 
> This fixes a bug happening when the address of a client side 'new_id'
> proxy object did not fit in a 32 bit integer.
> 
> Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
> ---
>  src/connection.c      |   16 +++++++++++-----
>  src/wayland-client.c  |    2 +-
>  src/wayland-private.h |    7 ++++++-
>  src/wayland-server.c  |    2 +-
>  4 files changed, 19 insertions(+), 8 deletions(-)
> 
> diff --git a/src/connection.c b/src/connection.c
> index e6c2b64..b952da1 100644
> --- a/src/connection.c
> +++ b/src/connection.c
> @@ -801,7 +801,8 @@ wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects)
>  }
>  
>  static void
> -convert_arguments_to_ffi(const char *signature, union wl_argument *args,
> +convert_arguments_to_ffi(const char *signature, uint32_t flags,
> +			 union wl_argument *args,
>  			 int count, ffi_type **ffi_types, void** ffi_args)
>  {
>  	int i;
> @@ -834,8 +835,13 @@ convert_arguments_to_ffi(const char *signature, union wl_argument *args,
>  			ffi_args[i] = &args[i].o;
>  			break;
>  		case 'n':
> -			ffi_types[i] = &ffi_type_uint32;
> -			ffi_args[i] = &args[i].n;
> +			if (flags & WL_CLOSURE_INVOKE_CLIENT) {
> +				ffi_types[i] = &ffi_type_pointer;
> +				ffi_args[i] = &args[i].o;
> +			} else {
> +				ffi_types[i] = &ffi_type_uint32;
> +				ffi_args[i] = &args[i].n;
> +			}
>  			break;
>  		case 'a':
>  			ffi_types[i] = &ffi_type_pointer;
> @@ -855,7 +861,7 @@ convert_arguments_to_ffi(const char *signature, union wl_argument *args,
>  
> 
>  void
> -wl_closure_invoke(struct wl_closure *closure,
> +wl_closure_invoke(struct wl_closure *closure, uint32_t flags,
>  		  struct wl_object *target, void (*func)(void), void *data)
>  {
>  	int count;
> @@ -870,7 +876,7 @@ wl_closure_invoke(struct wl_closure *closure,
>  	ffi_types[1] = &ffi_type_pointer;
>  	ffi_args[1] = ⌖
>  
> -	convert_arguments_to_ffi(closure->message->signature, closure->args,
> +	convert_arguments_to_ffi(closure->message->signature, flags, closure->args,
>  				 count, ffi_types + 2, ffi_args + 2);
>  
>  	ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
> diff --git a/src/wayland-client.c b/src/wayland-client.c
> index 3ead2ac..c5ad96d 100644
> --- a/src/wayland-client.c
> +++ b/src/wayland-client.c
> @@ -836,7 +836,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
>  		if (wl_debug)
>  			wl_closure_print(closure, &proxy->object, false);
>  
> -		wl_closure_invoke(closure, &proxy->object,
> +		wl_closure_invoke(closure, WL_CLOSURE_INVOKE_CLIENT, &proxy->object,
>  				  proxy->object.implementation[opcode],
>  				  proxy->user_data);
>  	}
> diff --git a/src/wayland-private.h b/src/wayland-private.h
> index f0c9010..4b757a1 100644
> --- a/src/wayland-private.h
> +++ b/src/wayland-private.h
> @@ -129,8 +129,13 @@ wl_connection_demarshal(struct wl_connection *connection,
>  int
>  wl_closure_lookup_objects(struct wl_closure *closure, struct wl_map *objects);
>  
> +enum wl_closure_invoke_flag {
> +	WL_CLOSURE_INVOKE_CLIENT = (1 << 0),
> +	WL_CLOSURE_INVOKE_SERVER = (1 << 1)
> +};
> +
>  void
> -wl_closure_invoke(struct wl_closure *closure,
> +wl_closure_invoke(struct wl_closure *closure, uint32_t flags,
>  		  struct wl_object *target, void (*func)(void), void *data);
>  int
>  wl_closure_send(struct wl_closure *closure, struct wl_connection *connection);
> diff --git a/src/wayland-server.c b/src/wayland-server.c
> index 2f3ddc9..aaecf29 100644
> --- a/src/wayland-server.c
> +++ b/src/wayland-server.c
> @@ -277,7 +277,7 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
>  		if (wl_debug)
>  			wl_closure_print(closure, object, false);
>  
> -		wl_closure_invoke(closure, object,
> +		wl_closure_invoke(closure, WL_CLOSURE_INVOKE_SERVER, object,
>  				  object->implementation[opcode], client);
>  
>  		wl_closure_destroy(closure);





More information about the wayland-devel mailing list