diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-11-07 22:01:18 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-11-07 22:01:18 +0100 |
commit | df7fcc6cac30738852965d9f4c1b6e90c6a977ae (patch) | |
tree | 195a4ec5a93491b3314303150a29a7135cd1fd23 /sys | |
parent | c0d21d35b103e980e658fff1ef07107e72a03364 (diff) |
libdraw: fix gengetwindow()
- fix fd leak in winname read() <= 0 case
- avoid freeing d->image (was by freeimage((*scrp)->image))
- dont leak screen and window in fullscreen mode
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/libdraw/init.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/sys/src/libdraw/init.c b/sys/src/libdraw/init.c index ce6f0bc6c..bae7739b4 100644 --- a/sys/src/libdraw/init.c +++ b/sys/src/libdraw/init.c @@ -127,12 +127,9 @@ gengetwindow(Display *d, char *winname, Image **winp, Screen **scrp, int ref) retry: fd = open(winname, OREAD); if(fd<0 || (n=read(fd, buf, sizeof buf-1))<=0){ - if((image=d->image) == nil){ - *winp = nil; - d->screenimage = nil; - return -1; - } + if(fd >= 0) close(fd); strcpy(buf, "noborder"); + image = d->image; }else{ close(fd); buf[n] = '\0'; @@ -148,37 +145,40 @@ retry: goto retry; } } - if(*winp != nil){ - _freeimage1(*winp); + } + if(*winp != nil){ + _freeimage1(*winp); + if((*scrp)->image != nil + && (*scrp)->image != image + && (*scrp)->image != d->image) freeimage((*scrp)->image); - freescreen(*scrp); - *scrp = nil; - } - if(image == nil){ - *winp = nil; - d->screenimage = nil; - return -1; - } + freescreen(*scrp); + *scrp = nil; + } + if(image == nil){ + *winp = nil; + d->screenimage = nil; + return -1; } - d->screenimage = image; *scrp = allocscreen(image, d->white, 0); if(*scrp == nil){ *winp = nil; d->screenimage = nil; - freeimage(image); + if(image != d->image) + freeimage(image); return -1; } - r = image->r; if(strncmp(buf, "noborder", 8) != 0) - r = insetrect(image->r, Borderwidth); + r = insetrect(r, Borderwidth); *winp = _allocwindow(*winp, *scrp, r, ref, DWhite); if(*winp == nil){ freescreen(*scrp); *scrp = nil; d->screenimage = nil; - freeimage(image); + if(image != d->image) + freeimage(image); return -1; } d->screenimage = *winp; |