summaryrefslogtreecommitdiff
path: root/sys/src/libdraw
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-09-05 18:34:46 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-09-05 18:34:46 +0200
commit45f2fd3c01768f6483e4d583e4ca06c8e11362f4 (patch)
tree38cc5e0dc9dd398f4dbe16d7e5b12288f6cc7346 /sys/src/libdraw
parent9cddb6ed33051b8d19753e348a2eed3296622397 (diff)
libdraw: fix old subfont leak
Diffstat (limited to 'sys/src/libdraw')
-rw-r--r--sys/src/libdraw/cloadimage.c4
-rw-r--r--sys/src/libdraw/creadimage.c2
-rw-r--r--sys/src/libdraw/freesubfont.c5
-rw-r--r--sys/src/libdraw/getsubfont.c6
-rw-r--r--sys/src/libdraw/readimage.c10
-rw-r--r--sys/src/libdraw/string.c5
-rw-r--r--sys/src/libdraw/stringwidth.c6
-rw-r--r--sys/src/libdraw/subfont.c3
-rw-r--r--sys/src/libdraw/subfontcache.c2
9 files changed, 22 insertions, 21 deletions
diff --git a/sys/src/libdraw/cloadimage.c b/sys/src/libdraw/cloadimage.c
index eb30466cb..58ba5d7f5 100644
--- a/sys/src/libdraw/cloadimage.c
+++ b/sys/src/libdraw/cloadimage.c
@@ -20,14 +20,14 @@ cloadimage(Image *i, Rectangle r, uchar *data, int ndata)
maxy = atoi((char*)data+0*12);
nb = atoi((char*)data+1*12);
if(maxy<=miny || r.max.y<maxy){
- werrstr("creadimage: bad maxy %d", maxy);
+ werrstr("cloadimage: bad maxy %d", maxy);
return -1;
}
data += 2*12;
ndata -= 2*12;
m += 2*12;
if(nb<=0 || ncblock<nb || nb>ndata){
- werrstr("creadimage: bad count %d", nb);
+ werrstr("cloadimage: bad count %d", nb);
return -1;
}
a = bufimage(i->display, 21+nb);
diff --git a/sys/src/libdraw/creadimage.c b/sys/src/libdraw/creadimage.c
index b9d7e4ed8..351177e8d 100644
--- a/sys/src/libdraw/creadimage.c
+++ b/sys/src/libdraw/creadimage.c
@@ -58,7 +58,6 @@ creadimage(Display *d, int fd, int dolock)
if(dolock)
lockdisplay(d);
i = allocimage(d, r, chan, 0, 0);
- setmalloctag(i, getcallerpc(&d));
if(dolock)
unlockdisplay(d);
if(i == nil)
@@ -68,6 +67,7 @@ creadimage(Display *d, int fd, int dolock)
if(i == nil)
return nil;
}
+ setmalloctag(i, getcallerpc(&d));
ncblock = _compblocksize(r, chantodepth(chan));
buf = malloc(ncblock);
if(buf == nil)
diff --git a/sys/src/libdraw/freesubfont.c b/sys/src/libdraw/freesubfont.c
index b4d8b1a2e..b34d66652 100644
--- a/sys/src/libdraw/freesubfont.c
+++ b/sys/src/libdraw/freesubfont.c
@@ -5,10 +5,7 @@
void
freesubfont(Subfont *f)
{
- if(f == 0)
- return;
- f->ref--;
- if(f->ref > 0)
+ if(f == nil || --f->ref)
return;
uninstallsubfont(f);
free(f->name);
diff --git a/sys/src/libdraw/getsubfont.c b/sys/src/libdraw/getsubfont.c
index 04cc87355..8f3b59d50 100644
--- a/sys/src/libdraw/getsubfont.c
+++ b/sys/src/libdraw/getsubfont.c
@@ -13,7 +13,6 @@ _getsubfont(Display *d, char *name)
Subfont *f;
fd = open(name, OREAD);
-
if(fd < 0){
fprint(2, "getsubfont: can't open %s: %r\n", name);
return 0;
@@ -29,9 +28,8 @@ _getsubfont(Display *d, char *name)
f = readsubfont(d, name, fd, d && d->locking==0);
if(d && d->locking == 0)
lockdisplay(d);
- if(f == 0)
- fprint(2, "getsubfont: can't read %s: %r\n", name);
close(fd);
- setmalloctag(f, getcallerpc(&d));
+ if(f == 0)
+ fprint(2, "_getsubfont: can't read %s: %r\n", name);
return f;
}
diff --git a/sys/src/libdraw/readimage.c b/sys/src/libdraw/readimage.c
index 3c80b4982..5745bad9b 100644
--- a/sys/src/libdraw/readimage.c
+++ b/sys/src/libdraw/readimage.c
@@ -19,8 +19,12 @@ readimage(Display *d, int fd, int dolock)
if(readn(fd, hdr, 11) != 11)
return nil;
- if(memcmp(hdr, "compressed\n", 11) == 0)
- return creadimage(d, fd, dolock);
+ if(memcmp(hdr, "compressed\n", 11) == 0){
+ if(i = creadimage(d, fd, dolock))
+ goto Done;
+ return nil;
+ }
+
if(readn(fd, hdr+11, 5*12-11) != 5*12-11)
return nil;
if(d)
@@ -123,5 +127,7 @@ readimage(Display *d, int fd, int dolock)
miny += dy;
}
free(tmp);
+ Done:
+ setmalloctag(i, getcallerpc(&d));
return i;
}
diff --git a/sys/src/libdraw/string.c b/sys/src/libdraw/string.c
index 4e876c170..70e7a2797 100644
--- a/sys/src/libdraw/string.c
+++ b/sys/src/libdraw/string.c
@@ -134,11 +134,8 @@ _string(Image *dst, Point pt, Image *src, Point sp, Font *f, char *s, Rune *r, i
else
break;
}
- /*
- * must not free sf until cachechars has found it in the cache
- * and picked up its own reference.
- */
}
}
+ freesubfont(sf);
return pt;
}
diff --git a/sys/src/libdraw/stringwidth.c b/sys/src/libdraw/stringwidth.c
index eb2bb42e7..004b695e7 100644
--- a/sys/src/libdraw/stringwidth.c
+++ b/sys/src/libdraw/stringwidth.c
@@ -12,6 +12,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
Rune rune, **rptr;
char *subfontname, **sptr;
Font *def;
+ Subfont *sf;
if(s == nil){
s = "";
@@ -23,6 +24,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
rptr = nil;
}else
rptr = &r;
+ sf = nil;
twid = 0;
while(len>0 && (*s || *r)){
max = Max;
@@ -43,7 +45,8 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
return twid;
}
if(subfontname){
- if(_getsubfont(f->display, subfontname) == 0){
+ freesubfont(sf);
+ if((sf=_getsubfont(f->display, subfontname)) == 0){
def = f->display->defaultfont;
if(def && f!=def)
f = def;
@@ -56,6 +59,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len)
twid += wid;
len -= l;
}
+ freesubfont(sf);
return twid;
}
diff --git a/sys/src/libdraw/subfont.c b/sys/src/libdraw/subfont.c
index 61838b054..512418f95 100644
--- a/sys/src/libdraw/subfont.c
+++ b/sys/src/libdraw/subfont.c
@@ -20,8 +20,7 @@ allocsubfont(char *name, int n, int height, int ascent, Fontchar *info, Image *i
f->ref = 1;
if(name){
f->name = strdup(name);
- if(lookupsubfont(i->display, name) == 0)
- installsubfont(name, f);
+ installsubfont(name, f);
}else
f->name = 0;
return f;
diff --git a/sys/src/libdraw/subfontcache.c b/sys/src/libdraw/subfontcache.c
index 91a6861a9..dd4f0b1fe 100644
--- a/sys/src/libdraw/subfontcache.c
+++ b/sys/src/libdraw/subfontcache.c
@@ -7,7 +7,7 @@
*/
static char *lastname;
-Subfont *lastsubfont;
+static Subfont *lastsubfont;
Subfont*
lookupsubfont(Display *d, char *name)