From 0cfd6f6cfc9e90c12e4bad17dc47e7ce4cf1b9ac Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Wed, 27 Sep 2017 19:49:11 +0100 Subject: [PATCH] wayland-drm: use a copy of the wayland_drm_callbacks struct The callbacks may be called even when they are no longer valid. Say, the user is dlclose(ing) libEGL while the buffers are being destroyed. Cc: mesa-stable@lists.freedesktop.org Signed-off-by: Emil Velikov Reviewed-by: Daniel Stone Tested-by: Derek Foreman --- src/egl/wayland/wayland-drm/wayland-drm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c b/src/egl/wayland/wayland-drm/wayland-drm.c index 2e256aea6d5..0f0a2317c7e 100644 --- a/src/egl/wayland/wayland-drm/wayland-drm.c +++ b/src/egl/wayland/wayland-drm/wayland-drm.c @@ -47,7 +47,7 @@ struct wl_drm { char *device_name; uint32_t flags; - struct wayland_drm_callbacks *callbacks; + struct wayland_drm_callbacks callbacks; struct wl_buffer_interface buffer_interface; }; @@ -58,7 +58,7 @@ destroy_buffer(struct wl_resource *resource) struct wl_drm_buffer *buffer = wl_resource_get_user_data(resource); struct wl_drm *drm = buffer->drm; - drm->callbacks->release_buffer(drm->user_data, buffer); + drm->callbacks.release_buffer(drm->user_data, buffer); free(buffer); } @@ -97,7 +97,7 @@ create_buffer(struct wl_client *client, struct wl_resource *resource, buffer->offset[2] = offset2; buffer->stride[2] = stride2; - drm->callbacks->reference_buffer(drm->user_data, name, fd, buffer); + drm->callbacks.reference_buffer(drm->user_data, name, fd, buffer); if (buffer->driver_buffer == NULL) { wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_NAME, @@ -189,7 +189,7 @@ drm_authenticate(struct wl_client *client, { struct wl_drm *drm = wl_resource_get_user_data(resource); - if (drm->callbacks->authenticate(drm->user_data, id) < 0) + if (drm->callbacks.authenticate(drm->user_data, id) < 0) wl_resource_post_error(resource, WL_DRM_ERROR_AUTHENTICATE_FAIL, "authenicate failed"); @@ -270,7 +270,7 @@ wayland_drm_init(struct wl_display *display, char *device_name, drm->display = display; drm->device_name = strdup(device_name); - drm->callbacks = callbacks; + drm->callbacks = *callbacks; drm->user_data = user_data; drm->flags = flags; -- 2.30.2