[PATCH] glx: Avoid use-after-free after drawableGone
jamey at minilop.net
jamey at minilop.net
Wed Sep 22 08:12:45 PDT 2010
I don't know the code, but this looks pretty obvious.
Reviewed-by: Jamey Sharp <jamey at minilop.net>
On Wed, Sep 22, 2010 at 5:32 AM, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Becareful during list processing to keep valgrind quiet:
>
> ==2989== Invalid read of size 4
> ==2989== at 0x48CE6B5: DrawableGone (glxext.c:168)
> ==2989== by 0x809F401: FreeResource (resource.c:601)
> ==2989== by 0x80845CE: ProcDestroyWindow (dispatch.c:733)
> ==2989== by 0x8087D76: Dispatch (dispatch.c:432)
> ==2989== by 0x8066439: main (main.c:291)
> ==2989== Address 0x55a9c1c is 76 bytes inside a block of size 88 free'd
> ==2989== at 0x4023B6A: free (vg_replace_malloc.c:366)
> ==2989== by 0x48D9DD8: __glXDRIcontextDestroy (glxdri2.c:250)
> ==2989== by 0x48CE1A0: __glXFreeContext (glxext.c:222)
> ==2989== by 0x48CE786: DrawableGone (glxext.c:165)
> ==2989== by 0x809F401: FreeResource (resource.c:601)
> ==2989== by 0x80845CE: ProcDestroyWindow (dispatch.c:733)
> ==2989== by 0x8087D76: Dispatch (dispatch.c:432)
> ==2989== by 0x8066439: main (main.c:291)
>
> Reported-by: Julien Cristau <jcristau at debian.org>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Kristian Høgsberg <krh at bitplanet.net>
> ---
> glx/glxext.c | 11 +++++------
> 1 files changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/glx/glxext.c b/glx/glxext.c
> index e203156..69ed24e 100644
> --- a/glx/glxext.c
> +++ b/glx/glxext.c
> @@ -124,7 +124,7 @@ static int glxBlockClients;
> */
> static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
> {
> - __GLXcontext *c;
> + __GLXcontext *c, *tmp;
>
> /* If this drawable was created using glx 1.3 drawable
> * constructors, we added it as a glx drawable resource under both
> @@ -137,7 +137,8 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
> FreeResourceByType(glxPriv->drawId, __glXDrawableRes, TRUE);
> }
>
> - for (c = glxAllContexts; c; c = c->next) {
> + for (c = glxAllContexts; c; c = tmp) {
> + tmp = c->next;
> if (c->isCurrent && (c->drawPriv == glxPriv || c->readPriv == glxPriv)) {
> int i;
>
> @@ -160,15 +161,13 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
> }
> }
> }
> -
> - if (!c->idExists) {
> - __glXFreeContext(c);
> - }
> }
> if (c->drawPriv == glxPriv)
> c->drawPriv = NULL;
> if (c->readPriv == glxPriv)
> c->readPriv = NULL;
> + if (!c->idExists)
> + __glXFreeContext(c);
> }
>
> glxPriv->destroy(glxPriv);
> --
> 1.7.1
>
> _______________________________________________
> 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