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 <ja...@minilop.net> --- dix/window.c | 74 +++++++++++++++++++++++++++------------------------------ 1 files changed, 35 insertions(+), 39 deletions(-) diff --git a/dix/window.c b/dix/window.c index 44bfa18..c87020d 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; } /* -- 1.7.5.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel