From f15320faeeef8cc37be85eefca8a676e77276bca Mon Sep 17 00:00:00 2001 From: Giulio Camuffo Date: Thu, 8 Dec 2016 09:21:08 +0100 Subject: [PATCH] libweston-desktop: don't crash when getting the pid for X clients X client's don't have a wl_client associated with their weston_desktop_client, so make sure to not use it. Signed-off-by: Giulio Camuffo Reviewed-by: Quentin Glidic --- libweston-desktop/surface.c | 8 +++++++- libweston-desktop/xwayland.c | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libweston-desktop/surface.c b/libweston-desktop/surface.c index 2205107b..d3be9364 100644 --- a/libweston-desktop/surface.c +++ b/libweston-desktop/surface.c @@ -269,6 +269,8 @@ weston_desktop_surface_create(struct weston_desktop *desktop, wsurface->committed = weston_desktop_surface_committed; wsurface->committed_private = surface; + surface->pid = -1; + surface->surface_commit_listener.notify = weston_desktop_surface_surface_committed; wl_signal_add(&surface->surface->commit_signal, @@ -590,7 +592,7 @@ weston_desktop_surface_get_pid(struct weston_desktop_surface *surface) { pid_t pid; - if (surface->pid != 0) { + if (surface->pid != -1) { pid = surface->pid; } else { struct weston_desktop_client *client = @@ -598,6 +600,10 @@ weston_desktop_surface_get_pid(struct weston_desktop_surface *surface) struct wl_client *wl_client = weston_desktop_client_get_client(client); + /* wl_client should always be valid, because only in the + * xwayland case it wouldn't be, but in that case we won't + * reach here, as the pid is initialized to 0. */ + assert(wl_client); wl_client_get_credentials(wl_client, &pid, NULL, NULL); } return pid; diff --git a/libweston-desktop/xwayland.c b/libweston-desktop/xwayland.c index baacf7b9..6b90c14a 100644 --- a/libweston-desktop/xwayland.c +++ b/libweston-desktop/xwayland.c @@ -241,6 +241,8 @@ create_surface(struct weston_desktop_xwayland *xwayland, wl_resource_add_destroy_listener(wsurface->resource, &surface->resource_destroy_listener); + weston_desktop_surface_set_pid(surface->surface, 0); + return surface; }