dri: add another get shm variant.
authorDave Airlie <airlied@redhat.com>
Fri, 14 Feb 2020 05:00:13 +0000 (15:00 +1000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 25 Feb 2020 01:23:01 +0000 (01:23 +0000)
When Brian in 02c3dad0f3b4d26e0faa5cc51d06bc50d693dcdc restricted
the shm permissions it means we hit the fallback paths in some
scenarios we hadn't before.

When you use Xephyr to xdmcp from one user to another the new perms
stop the X server (running as user a) attaching to the SHM segments
from gnome-shell (running as user b).

In this case however only the GLX side of the code had insight into this,
and the dri could was meant of fall back, and it worked for put image
fine but the get image path was broken, since there was no indication
in the broken case of the need to fallback.

This adds a return type to a new interface member that lets the
caller know it has to fallback.

Fixes: 02c3dad0f3b4 ("Call shmget() with permission 0600 instead of 0777")
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3823>

include/GL/internal/dri_interface.h
src/gallium/state_trackers/dri/drisw.c

index 09782c8baeb84296432614d3f63604312e234870..e40106575c0260062afcbe684c970cf3767368c4 100644 (file)
@@ -634,7 +634,7 @@ struct __DRIdamageExtensionRec {
  * SWRast Loader extension.
  */
 #define __DRI_SWRAST_LOADER "DRI_SWRastLoader"
-#define __DRI_SWRAST_LOADER_VERSION 5
+#define __DRI_SWRAST_LOADER_VERSION 6
 struct __DRIswrastLoaderExtensionRec {
     __DRIextension base;
 
@@ -711,6 +711,19 @@ struct __DRIswrastLoaderExtensionRec {
                          int width, int height, int stride,
                          int shmid, char *shmaddr, unsigned offset,
                          void *loaderPrivate);
+
+    /**
+     * get shm image to drawable (v2)
+     *
+     * There are some cases where GLX can't use SHM, but DRI
+     * still tries, we need to get a return type for when to
+     * fallback to the non-shm path.
+     *
+     * \since 6
+     */
+    GLboolean (*getImageShm2)(__DRIdrawable *readable,
+                              int x, int y, int width, int height,
+                              int shmid, void *loaderPrivate);
 };
 
 /**
index e3fb3f1b9254fa89fec0c14e5b815cdb16e3b2d8..df364c47391b3c5590f8d04078218c8f53b6b868 100644 (file)
@@ -138,6 +138,9 @@ get_image_shm(__DRIdrawable *dPriv, int x, int y, int width, int height,
    if (!res->screen->resource_get_handle(res->screen, NULL, res, &whandle, PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE))
       return FALSE;
 
+   if (loader->base.version > 5 && loader->getImageShm2)
+      return loader->getImageShm2(dPriv, x, y, width, height, whandle.handle, dPriv->loaderPrivate);
+
    loader->getImageShm(dPriv, x, y, width, height, whandle.handle, dPriv->loaderPrivate);
    return TRUE;
 }