From 24c4c46b98e19733700cdb0bccf1c56577f0f56a Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 23 May 2006 03:55:45 +0000 Subject: fix _screen leak --- src/libdraw/devdraw.c | 21 +++++++-------------- src/libdraw/x11-init.c | 2 +- 2 files changed, 8 insertions(+), 15 deletions(-) (limited to 'src/libdraw') diff --git a/src/libdraw/devdraw.c b/src/libdraw/devdraw.c index 74e10c31..f4a3fd96 100644 --- a/src/libdraw/devdraw.c +++ b/src/libdraw/devdraw.c @@ -549,6 +549,8 @@ drawfreedimage(DImage *dimage) } ds = dimage->dscreen; l = dimage->image; + dimage->dscreen = nil; /* paranoia */ + dimage->image = nil; if(ds){ if(l->data == screenimage->data) addflush(l->layer->screenr); @@ -599,23 +601,14 @@ static int drawuninstall(Client *client, int id) { - DImage *d, *next; + DImage *d, **l; - d = client->dimage[id&HASHMASK]; - if(d == 0) - return -1; - if(d->id == id){ - client->dimage[id&HASHMASK] = d->next; - drawfreedimage(d); - return 0; - } - while(next = d->next){ /* assign = */ - if(next->id == id){ - d->next = next->next; - drawfreedimage(next); + for(l=&client->dimage[id&HASHMASK]; (d=*l) != nil; l=&d->next){ + if(d->id == id){ + *l = d->next; + drawfreedimage(d); return 0; } - d = next; } return -1; } diff --git a/src/libdraw/x11-init.c b/src/libdraw/x11-init.c index 277e8520..b824441b 100644 --- a/src/libdraw/x11-init.c +++ b/src/libdraw/x11-init.c @@ -154,6 +154,7 @@ getwindow(Display *d, int ref) d->image = i; /* fprint(2, "getwindow %p -> %p\n", oi, i); */ + freescreen(_screen); _screen = allocscreen(i, d->white, 0); _freeimage1(screen); screen = _allocwindow(screen, _screen, i->r, ref, DWhite); @@ -550,7 +551,6 @@ xattach(char *label) return _x.screenimage; err0: -fprint(2, "%r\n"); /* * Should do a better job of cleaning up here. */ -- cgit v1.2.3