privates: Clear screen-specific keys during CloseScreen
The modesetting driver corrupts memory when used after a server regeneration because not enough memory is allocated for its pixmap privates. This happens because its call to dixRegisterScreenSpecificPrivateKey() does nothing because key->initialized is still TRUE from the first server generation. However, the key is not in the screen's linked list of screen-specific privates because that's freed and reallocated during the server generation loop in dix_main(). Fix this by clearing key->initialized before CloseScreen and add a call to dixFreeScreenSpecificPrivates() for GPU screens. v2: Just set key->initialized to FALSE and move dixFreeScreenSpecificPrivates() calls to after CloseScreen. v3: Move dixFreeScreenSpecificPrivates() calls back to just before CloseScreen. Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
18a93da9b1
commit
82eb490b0a
|
@ -339,6 +339,7 @@ dix_main(int argc, char *argv[], char *envp[])
|
||||||
for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) {
|
for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) {
|
||||||
ScreenPtr pScreen = screenInfo.gpuscreens[i];
|
ScreenPtr pScreen = screenInfo.gpuscreens[i];
|
||||||
FreeScratchPixmapsForScreen(pScreen);
|
FreeScratchPixmapsForScreen(pScreen);
|
||||||
|
dixFreeScreenSpecificPrivates(pScreen);
|
||||||
(*pScreen->CloseScreen) (pScreen);
|
(*pScreen->CloseScreen) (pScreen);
|
||||||
dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
|
dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
|
||||||
free(pScreen);
|
free(pScreen);
|
||||||
|
|
|
@ -642,6 +642,15 @@ dixRegisterScreenSpecificPrivateKey(ScreenPtr pScreen, DevPrivateKey key,
|
||||||
void
|
void
|
||||||
dixFreeScreenSpecificPrivates(ScreenPtr pScreen)
|
dixFreeScreenSpecificPrivates(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
|
DevPrivateType t;
|
||||||
|
|
||||||
|
for (t = PRIVATE_XSELINUX; t < PRIVATE_LAST; t++) {
|
||||||
|
DevPrivateKey key;
|
||||||
|
|
||||||
|
for (key = pScreen->screenSpecificPrivates[t].key; key; key = key->next) {
|
||||||
|
key->initialized = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize screen-specific privates in AddScreen */
|
/* Initialize screen-specific privates in AddScreen */
|
||||||
|
|
Loading…
Reference in New Issue