I don't know the code, but this looks pretty obvious. Reviewed-by: Jamey Sharp <ja...@minilop.net>
On Wed, Sep 22, 2010 at 5:32 AM, Chris Wilson <ch...@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 <jcris...@debian.org> > Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> > Cc: Kristian Høgsberg <k...@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@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ 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