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>
{
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;
__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.