From 45ea17d2449576ffc1bf3c602d679c77dd63f39f Mon Sep 17 00:00:00 2001 From: Illia Polishchuk Date: Tue, 25 Apr 2023 11:42:20 +0300 Subject: [PATCH] glx: add fail check for current context in another thread 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 Signed-off-by: Illia Polishchuk Part-of: --- src/glx/glxcmds.c | 8 ++++++++ src/glx/glxcurrent.c | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 91c4c62..720cff0 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -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; diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c index 19b7019..31f0ecc 100644 --- a/src/glx/glxcurrent.c +++ b/src/glx/glxcurrent.c @@ -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. -- 2.7.4