diff options
author | Jamey Sharp <jamey@minilop.net> | 2011-11-20 01:15:49 -0800 |
---|---|---|
committer | Jamey Sharp <jamey@minilop.net> | 2011-11-20 01:27:52 -0800 |
commit | c70ce992a358e22f8c69b35b64f35ee2f8eaa47c (patch) | |
tree | e2a3fa357e2697d4c2ef9fdb70dff0689c767c2c | |
parent | 87a70acc81c9a8d8ad09b4de7f17ab40ea619f68 (diff) |
Factor out duplicated WindowOptPtr initialization.
By using the same code for both MakeWindowOptional and CreateRootWindow,
we ensure that new WindowOptPtrs are always fully initialized.
Previously, CreateRootWindow did not initialize optional->cursor. It
relied on InitRootWindow to overwrite it later, which seems like a wild
pointer dereference just waiting to happen.
Signed-off-by: Jamey Sharp <jamey@minilop.net>
-rw-r--r-- | dix/window.c | 74 |
1 files changed, 35 insertions, 39 deletions
diff --git a/dix/window.c b/dix/window.c index 44bfa182a..c87020dff 100644 --- a/dix/window.c +++ b/dix/window.c @@ -152,6 +152,12 @@ static unsigned char _back_msb[4] = {0x11, 0x44, 0x22, 0x88}; static Bool WindowParentHasDeviceCursor(WindowPtr pWin, DeviceIntPtr pDev, CursorPtr pCurs); +static WindowOptPtr +AllocateWindowOptional(CursorPtr cursor, + VisualID visual, + Colormap colormap, + Mask dontPropagateMask); + static Bool WindowSeekDeviceCursor(WindowPtr pWin, DeviceIntPtr pDev, @@ -481,25 +487,11 @@ CreateRootWindow(ScreenPtr pScreen) pWin->parent = NullWindow; SetWindowToDefaults(pWin); - pWin->optional = malloc(sizeof (WindowOptRec)); + pWin->optional = AllocateWindowOptional(None, + pScreen->rootVisual, pScreen->defColormap, 0); if (!pWin->optional) return FALSE; - pWin->optional->dontPropagateMask = 0; - pWin->optional->otherEventMasks = 0; - pWin->optional->otherClients = NULL; - pWin->optional->passiveGrabs = NULL; - pWin->optional->userProps = NULL; - pWin->optional->backingBitPlanes = ~0L; - pWin->optional->backingPixel = 0; - pWin->optional->boundingShape = NULL; - pWin->optional->clipShape = NULL; - pWin->optional->inputShape = NULL; - pWin->optional->inputMasks = NULL; - pWin->optional->deviceCursors = NULL; - pWin->optional->colormap = pScreen->defColormap; - pWin->optional->visual = pScreen->rootVisual; - pWin->nextSib = NullWindow; pWin->drawable.id = FakeClientID(0); @@ -3500,18 +3492,21 @@ CheckWindowOptionalNeed (WindowPtr w) * values. */ -Bool -MakeWindowOptional (WindowPtr pWin) +static WindowOptPtr +AllocateWindowOptional (CursorPtr cursor, + VisualID visual, + Colormap colormap, + Mask dontPropagateMask) { - WindowOptPtr optional; - WindowOptPtr parentOptional; - - if (pWin->optional) - return TRUE; - optional = malloc(sizeof (WindowOptRec)); + WindowOptPtr optional = malloc(sizeof (WindowOptRec)); if (!optional) - return FALSE; - optional->dontPropagateMask = DontPropagateMasks[pWin->dontPropagate]; + return NULL; + optional->cursor = cursor; + if (cursor) + cursor->refcnt++; + optional->visual = visual; + optional->colormap = colormap; + optional->dontPropagateMask = dontPropagateMask; optional->otherEventMasks = 0; optional->otherClients = NULL; optional->passiveGrabs = NULL; @@ -3523,21 +3518,22 @@ MakeWindowOptional (WindowPtr pWin) optional->inputShape = NULL; optional->inputMasks = NULL; optional->deviceCursors = NULL; + return optional; +} +Bool +MakeWindowOptional (WindowPtr pWin) +{ + WindowOptPtr parentOptional; + + if (pWin->optional) + return TRUE; parentOptional = FindWindowWithOptional(pWin)->optional; - optional->visual = parentOptional->visual; - if (!pWin->cursorIsNone) - { - optional->cursor = parentOptional->cursor; - optional->cursor->refcnt++; - } - else - { - optional->cursor = None; - } - optional->colormap = parentOptional->colormap; - pWin->optional = optional; - return TRUE; + pWin->optional = AllocateWindowOptional( + pWin->cursorIsNone ? None : parentOptional->cursor, + parentOptional->visual, parentOptional->colormap, + DontPropagateMasks[pWin->dontPropagate]); + return pWin->optional != NULL; } /* |