mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-21 14:30:04 +01:00
XQuartz: GL: Add a branch to prevent a NULL DrawablePtr structure access.
In attach() check for pDraw being NULL, and also print an ErrorF message,
because we eventually want to track down why this is occuring.
It's unclear how this occurs, but as I noted in the 1.4 branch, I believe that
the DrawablePtr/struct _Drawable -> id is the member being accessed that causes
KERN_PROTECTION_FAILURE at 0x0000000000000004
This passes my tests using: env LIBGL_ALWAYS_INDIRECT=1 ./sometest.
I fixed a warning: caused by initializing the screen->base.visuals with the
configs. It is a ** not a *. It seems that some other part of GLX will
initialize this for us.
(cherry picked from commit 17f6a261fc)
This commit is contained in:
parent
bc0c7075e2
commit
429b4b20d5
1 changed files with 37 additions and 24 deletions
|
|
@ -298,17 +298,27 @@ static void surface_notify(void *_arg, void *data) {
|
|||
}
|
||||
}
|
||||
|
||||
static void attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
|
||||
static BOOL attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
|
||||
DrawablePtr pDraw;
|
||||
|
||||
GLAQUA_DEBUG_MSG("attach(%p, %p)\n", context, draw);
|
||||
|
||||
if(NULL == context || NULL == draw)
|
||||
return TRUE;
|
||||
|
||||
pDraw = draw->base.pDraw;
|
||||
|
||||
if(NULL == pDraw) {
|
||||
ErrorF("%s:attach() pDraw is NULL!\n", __FILE__);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (draw->sid == 0) {
|
||||
//if (!quartzProcs->CreateSurface(pDraw->pScreen, pDraw->id, pDraw,
|
||||
if (!DRICreateSurface(pDraw->pScreen, pDraw->id, pDraw,
|
||||
0, &draw->sid, NULL,
|
||||
surface_notify, draw))
|
||||
return;
|
||||
return TRUE;
|
||||
draw->pDraw = pDraw;
|
||||
}
|
||||
|
||||
|
|
@ -323,7 +333,7 @@ static void attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
|
|||
x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(draw->sid));
|
||||
|
||||
draw->sid = 0;
|
||||
return;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
context->isAttached = TRUE;
|
||||
|
|
@ -341,6 +351,8 @@ static void attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
|
|||
GLAQUA_DEBUG_MSG("attached 0x%x to 0x%x\n", (unsigned int) pDraw->id,
|
||||
(unsigned int) draw->sid);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if 0 // unused
|
||||
|
|
@ -374,7 +386,8 @@ static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext) {
|
|||
|
||||
GLAQUA_DEBUG_MSG("glAquaMakeCurrent (ctx 0x%p)\n", baseContext);
|
||||
|
||||
attach(context, drawPriv);
|
||||
if(attach(context, drawPriv))
|
||||
return /*error*/ 0;
|
||||
|
||||
gl_err = CGLSetCurrentContext(context->ctx);
|
||||
if (gl_err != 0)
|
||||
|
|
@ -1310,8 +1323,8 @@ static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
|
|||
screen->base.fbconfigs = configs;
|
||||
screen->base.numFBConfigs = 1;
|
||||
|
||||
screen->base.visuals = configs;
|
||||
screen->base.numVisuals = 1;
|
||||
screen->base.visuals = NULL;
|
||||
screen->base.numVisuals = 0;
|
||||
|
||||
GlxSetVisualConfig(GLX_ALL_VISUALS);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue