[PATCH] [dbe] Fix pixmap validation in miDbePositionWindow.

Jamey Sharp jamey at minilop.net
Fri May 28 09:26:31 PDT 2010


GPG was not kind to your diff. Now I understand why kernel folks don't
like gpg-signed patches, as sad as that is.

But anyway, the patch looks good to me:
Reviewed-by: Jamey Sharp <jamey at minilop.net>

I especially like that you've replaced (DrawablePtr)pFrontBuffer with
&pFrontBuffer->drawable, since that pattern has been bugging me
elsewhere.

I bet there are more instances of mis-validated GCs around. I take it
somebody actually encountered this one though?

Jamey

On Fri, May 28, 2010 at 9:10 AM, Aaron Plattner <aplattner at nvidia.com> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> miDbePositionWindow allocates two pixmaps: a front buffer, and a back buffer.
> If the buffers are supposed to be initialized, it validates a GC against the
> front buffer, then uses it to fill and/or copy both the front buffer *and* the
> back buffer, without revalidating.  If the acceleration architecture needs
> different GC funcs for the two pixmaps -- for example if allocation of the front
> buffer exhausted video memory -- then this can cause crashes because the GC is
> not validated for the back buffer pixmap.
>
> Fix this by performing the rendering for the front buffer first, then
> revalidating against the back buffer before performing the back buffer
> rendering.
>
> Signed-off-by: Aaron Plattner <aplattner at nvidia.com>
> - ---
>  dbe/midbe.c |   20 ++++++++++++++------
>  1 files changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/dbe/midbe.c b/dbe/midbe.c
> index e47a253..49689c5 100644
> - --- a/dbe/midbe.c
> +++ b/dbe/midbe.c
> @@ -695,25 +695,33 @@ miDbePositionWindow(WindowPtr pWin, int x, int y)
>
>
>         pDbeWindowPrivPriv = MI_DBE_WINDOW_PRIV_PRIV(pDbeWindowPriv);
> - -        ValidateGC((DrawablePtr)pFrontBuffer, pGC);
>
>        /* I suppose this could avoid quite a bit of work if
>         * it computed the minimal area required.
>         */
> +       ValidateGC(&pFrontBuffer->drawable, pGC);
>        if (clear)
>         {
>            (*pGC->ops->PolyFillRect)((DrawablePtr)pFrontBuffer, pGC, 1,
>                                      &clearRect);
> - -         (*pGC->ops->PolyFillRect)((DrawablePtr)pBackBuffer , pGC, 1,
> - -                                   &clearRect);
> - -        }
> - -
> - -        /* Copy the contents of the old DBE pixmaps to the new pixmaps. */
> +       }
> +       /* Copy the contents of the old front pixmap to the new one. */
>        if (pWin->bitGravity != ForgetGravity)
>        {
>            (*pGC->ops->CopyArea)((DrawablePtr)pDbeWindowPrivPriv->pFrontBuffer,
>                                   (DrawablePtr)pFrontBuffer, pGC, sourcex,
>                                   sourcey, savewidth, saveheight, destx, desty);
> +        }
> +
> +       ValidateGC(&pBackBuffer->drawable, pGC);
> +       if (clear)
> +       {
> +           (*pGC->ops->PolyFillRect)((DrawablePtr)pBackBuffer , pGC, 1,
> +                                     &clearRect);
> +       }
> +       /* Copy the contents of the old back pixmap to the new one. */
> +       if (pWin->bitGravity != ForgetGravity)
> +       {
>            (*pGC->ops->CopyArea)((DrawablePtr)pDbeWindowPrivPriv->pBackBuffer,
>                                   (DrawablePtr)pBackBuffer, pGC, sourcex,
>                                   sourcey, savewidth, saveheight, destx, desty);
> - --
> 1.7.0.4
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iQEcBAEBAgAGBQJL/+rdAAoJEHYgpP6LHaLQ/gQIAJA4YYvC+FpAps8bBnAeGi/w
> y/E2CFwB4OQaUgUZhct472qXb6WQL2PuVikIgWPY7bn+lx5aR6T/7F+AKhBbfleL
> k4e5vaElaaNyAnCx7XedXwRGowmMDrbAarDSUQQ4HNIzo/hXenuxEhKa8z8R9D26
> X3DgshrF2cIUm/NPRaQza5aTKvJZUE1x3RmDtK2peREFyL0Kpy0lprrjmRDCoYJw
> pERZH6AFEJMfxYq+X6rz9fsc8CpgYHlDjWjn8qlE913HrAvwqOvkNySPn818PpQA
> E8Wu9nF1vwFLiFbDp4Stlgt23JLvaVAuaCXTnW6HPOJiygZ2Cp6f5pp93X9pXfk=
> =wK0z
> -----END PGP SIGNATURE-----
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>


More information about the xorg-devel mailing list