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 <ajax@redhat.com>
Signed-off-by: Illia Polishchuk <illia.a.polishchuk@globallogic.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22546>
This commit is contained in:
Illia Polishchuk
2023-04-25 11:42:20 +03:00
committed by Marge Bot
parent 2795cf7422
commit 45ea17d244
2 changed files with 17 additions and 0 deletions

View 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;

View 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.