glx: test for valid read and draw privates before using them

this should fix a bug where f-spot exiting blows up the X server
This commit is contained in:
Dave Airlie 2008-04-24 16:37:29 +10:00
parent f377141912
commit ae982a27e4

View File

@ -81,38 +81,40 @@ __glXDeassociateContext(__GLXcontext *glxc)
__GLXcontext *curr, *prev; __GLXcontext *curr, *prev;
prev = NULL; prev = NULL;
for ( curr = glxc->drawPriv->drawGlxc if (glxc->drawPriv) {
; curr != NULL for ( curr = glxc->drawPriv->drawGlxc; curr != NULL
; prev = curr, curr = curr->nextDrawPriv ) { ; prev = curr, curr = curr->nextDrawPriv ) {
if (curr == glxc) { if (curr == glxc) {
/* found context. Deassociate. */ /* found context. Deassociate. */
if (prev == NULL) { if (prev == NULL) {
glxc->drawPriv->drawGlxc = curr->nextDrawPriv; glxc->drawPriv->drawGlxc = curr->nextDrawPriv;
} else { } else {
prev->nextDrawPriv = curr->nextDrawPriv; prev->nextDrawPriv = curr->nextDrawPriv;
}
curr->nextDrawPriv = NULL;
__glXUnrefDrawable(glxc->drawPriv);
break;
} }
curr->nextDrawPriv = NULL; }
__glXUnrefDrawable(glxc->drawPriv);
break;
}
} }
prev = NULL; prev = NULL;
for ( curr = glxc->readPriv->readGlxc if (glxc->readPriv) {
; curr != NULL for ( curr = glxc->readPriv->readGlxc
; prev = curr, curr = curr->nextReadPriv ) { ; curr != NULL
if (curr == glxc) { ; prev = curr, curr = curr->nextReadPriv ) {
/* found context. Deassociate. */ if (curr == glxc) {
if (prev == NULL) { /* found context. Deassociate. */
glxc->readPriv->readGlxc = curr->nextReadPriv; if (prev == NULL) {
} else { glxc->readPriv->readGlxc = curr->nextReadPriv;
prev->nextReadPriv = curr->nextReadPriv; } else {
} prev->nextReadPriv = curr->nextReadPriv;
curr->nextReadPriv = NULL; }
__glXUnrefDrawable(glxc->readPriv); curr->nextReadPriv = NULL;
break; __glXUnrefDrawable(glxc->readPriv);
} break;
}
}
} }
} }