Module: Mesa
Branch: master
Commit: 5b7e65136440f60a6afe85c9517f42861ee07224
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=5b7e65136440f60a6afe85c9517f42861ee07224

Author: Daniel Stone <[email protected]>
Date:   Fri Sep 22 15:40:59 2017 -0700

Revert "wayland-drm: constify the callbacks struct"

The wayland-drm callback struct is referenced, rather than duplicated,
inside wayland-drm. Constifying this struct involved moving it on to the
stack; as a result, starting any EGL client on Wayland called into
random stack memory, and killed the compositor.

This reverts commit 1d0be5b3fe548ee33d4520092f583c76d42510a6 and
39d539e321c6c97433a15660c9d9a20ad8657ff0.

Signed-off-by: Daniel Stone <[email protected]>
Cc: Emil Velikov <[email protected]>
Cc: Krzysztof Sobiecki <[email protected]>
Fixes: 1d0be5b3fe54 ("wayland-drm: constify the callbacks struct")

---

 src/egl/drivers/dri2/egl_dri2.c           | 14 +++++++++-----
 src/egl/wayland/wayland-drm/wayland-drm.c |  4 ++--
 src/egl/wayland/wayland-drm/wayland-drm.h |  2 +-
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 0dce2246c1..8f58992696 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -2718,16 +2718,17 @@ dri2_wl_release_buffer(void *user_data, struct 
wl_drm_buffer *buffer)
    dri2_dpy->image->destroyImage(buffer->driver_buffer);
 }
 
+static struct wayland_drm_callbacks wl_drm_callbacks = {
+        .authenticate = NULL,
+        .reference_buffer = dri2_wl_reference_buffer,
+        .release_buffer = dri2_wl_release_buffer
+};
+
 static EGLBoolean
 dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
                              struct wl_display *wl_dpy)
 {
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
-   const struct wayland_drm_callbacks wl_drm_callbacks = {
-      .authenticate = (int(*)(void *, uint32_t)) dri2_dpy->vtbl->authenticate,
-      .reference_buffer = dri2_wl_reference_buffer,
-      .release_buffer = dri2_wl_release_buffer
-   };
    int flags = 0;
    uint64_t cap;
 
@@ -2736,6 +2737,9 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay 
*disp,
    if (dri2_dpy->wl_server_drm)
            return EGL_FALSE;
 
+   wl_drm_callbacks.authenticate =
+      (int(*)(void *, uint32_t)) dri2_dpy->vtbl->authenticate;
+
    if (drmGetCap(dri2_dpy->fd, DRM_CAP_PRIME, &cap) == 0 &&
        cap == (DRM_PRIME_CAP_IMPORT | DRM_PRIME_CAP_EXPORT) &&
        dri2_dpy->image->base.version >= 7 &&
diff --git a/src/egl/wayland/wayland-drm/wayland-drm.c 
b/src/egl/wayland/wayland-drm/wayland-drm.c
index 5c17b4386b..2e256aea6d 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;
 
-       const struct wayland_drm_callbacks *callbacks;
+       struct wayland_drm_callbacks *callbacks;
 
         struct wl_buffer_interface buffer_interface;
 };
@@ -259,7 +259,7 @@ wayland_drm_buffer_get(struct wl_drm *drm, struct 
wl_resource *resource)
 
 struct wl_drm *
 wayland_drm_init(struct wl_display *display, char *device_name,
-                 const struct wayland_drm_callbacks *callbacks, void 
*user_data,
+                 struct wayland_drm_callbacks *callbacks, void *user_data,
                  uint32_t flags)
 {
        struct wl_drm *drm;
diff --git a/src/egl/wayland/wayland-drm/wayland-drm.h 
b/src/egl/wayland/wayland-drm/wayland-drm.h
index 111383ff1d..77e8d27304 100644
--- a/src/egl/wayland/wayland-drm/wayland-drm.h
+++ b/src/egl/wayland/wayland-drm/wayland-drm.h
@@ -34,7 +34,7 @@ wayland_drm_buffer_get(struct wl_drm *drm, struct wl_resource 
*resource);
 
 struct wl_drm *
 wayland_drm_init(struct wl_display *display, char *device_name,
-                const struct wayland_drm_callbacks *callbacks, void *user_data,
+                struct wayland_drm_callbacks *callbacks, void *user_data,
                  uint32_t flags);
 
 void

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to