driDestroyDisplay: Remove Drivers list entry when dlclosing its handle.

This fixes a regression from commit f81b1dbe374fe446f6ef676e70a72952ffb47d4e:
Since then, driDestroyDisplay gets called from __glXFreeDisplayPrivate. It
dlcloses the handles associated with the display but fails to remove their
references from the Drivers list, so subsequent calls to OpenDriver return a
stale handle and an invalid createNewScreenFunc pointer. The attempt to call
the latter results in a segfault when running amoeba, e.g.
This commit is contained in:
Michel Dänzer 2007-02-01 10:43:10 +01:00
parent a2104dc6e1
commit bed026e7dd
1 changed files with 18 additions and 2 deletions

View File

@ -386,8 +386,24 @@ static void driDestroyDisplay(Display *dpy, void *private)
const int numScreens = ScreenCount(dpy);
int i;
for (i = 0; i < numScreens; i++) {
if (pdpyp->libraryHandles[i])
dlclose(pdpyp->libraryHandles[i]);
if (pdpyp->libraryHandles[i]) {
__DRIdriver *driver, *prev;
/* Remove driver from Drivers list */
for (prev = NULL, driver = Drivers; driver;
prev = driver, driver = driver->next) {
if (driver->handle == pdpyp->libraryHandles[i]) {
if (prev)
prev->next = driver->next;
else
Drivers = driver->next;
Xfree(driver);
}
}
dlclose(pdpyp->libraryHandles[i]);
}
}
Xfree(pdpyp->libraryHandles);
Xfree(pdpyp);