glx: add fail check for current context in another thread
authorIllia Polishchuk <illia.a.polishchuk@globallogic.com>
Tue, 25 Apr 2023 08:42:20 +0000 (11:42 +0300)
committerMarge Bot <emma+marge@anholt.net>
Wed, 26 Apr 2023 00:20:08 +0000 (00:20 +0000)
The GLX spec for glXMakeCurrent (3.3):
"If ctx is current to some other thread, then glXMakeCurrent will generate
a BadAccess error"

The GLX spec for glXCopyContext (3.3):
"If the destination context is current for some thread then a BadAccess
error is generated"

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7961
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Illia Polishchuk <illia.a.polishchuk@globallogic.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22546>

src/glx/glxcmds.c
src/glx/glxcurrent.c

index 91c4c62..720cff0 100644 (file)
@@ -579,6 +579,14 @@ glXCopyContext(Display * dpy, GLXContext source_user,
 {
    struct glx_context *source = (struct glx_context *) source_user;
    struct glx_context *dest = (struct glx_context *) dest_user;
+
+   /* GLX spec 3.3: If the destination context is current for some thread
+    * then a BadAccess error is generated
+    */
+   if (dest && dest->currentDpy) {
+      __glXSendError(dpy, BadAccess, 0, X_GLXCopyContext, true);
+      return;
+   }
 #ifdef GLX_USE_APPLEGL
    struct glx_context *gc = __glXGetCurrentContext();
    int errorcode;
index 19b7019..31f0ecc 100644 (file)
@@ -138,6 +138,15 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw,
    __glXSetCurrentContextNull();
 
    if (gc) {
+      /* GLX spec 3.3: If ctx is current to some other thread, then
+       * glXMakeContextCurrent will generate a BadAccess error
+       */
+      if (gc->currentDpy)
+      {
+         __glXUnlock();
+         __glXSendError(dpy, BadAccess, None, opcode, True);
+         return False;
+      }
       /* Attempt to bind the context.  We do this before mucking with
        * gc and __glXSetCurrentContext to properly handle our state in
        * case of an error.