The dixRegisterScreenSpecificPrivateKey function ignores attempts to register the same key twice. Unlike dixRegisterPrivateKey, it can not use the "initialized" flag because there is no good place where to set it to FALSE during reset.
Setting it before CloseScreen makes the keys unuseable in CloseScreen. Setting it after CloseScreen is not possible because some keys may have been deallocated by CloseScreen. Instead just search the list and ignore keys that are already there. The dixFreeScreenSpecificPrivates is left empty as it was before 82eb490. Signed-off-by: Michal Srb <m...@suse.com> Fixes: 82eb490 (privates: Clear screen-specific keys during CloseScreen) Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108762 --- dix/privates.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/dix/privates.c b/dix/privates.c index 9ca80f0b6..6c31500e4 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -600,14 +600,22 @@ dixRegisterScreenSpecificPrivateKey(ScreenPtr pScreen, DevPrivateKey key, { int offset; unsigned bytes; + DevPrivateKey iter; if (!screen_specific_private[type]) FatalError("Attempt to allocate screen-specific private storage for type %s\n", key_names[type]); - if (key->initialized) { - assert(size == key->size); - return TRUE; + /* + * We can not simply check key->initialized, because there is no + * reasonable place where it could be set to FALSE during internal reset. + */ + for (iter = pScreen->screenSpecificPrivates[type].key; iter; + iter = iter->next) { + if (iter == key) { + assert(size == key->size); + return TRUE; + } } /* Compute required space */ @@ -639,15 +647,6 @@ dixRegisterScreenSpecificPrivateKey(ScreenPtr pScreen, DevPrivateKey key, void 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 */ -- 2.16.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel