From b2f9ee0de55f3c59c83f479d12cfe8c894935bd7 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 13 Jul 2005 03:57:24 +0000 Subject: free subfonts correctly --- src/libdraw/stringwidth.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src/libdraw/stringwidth.c') diff --git a/src/libdraw/stringwidth.c b/src/libdraw/stringwidth.c index 8d8c6d08..522fbc01 100644 --- a/src/libdraw/stringwidth.c +++ b/src/libdraw/stringwidth.c @@ -13,6 +13,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len) Rune rune, **rptr; char *subfontname, **sptr; Font *def; + Subfont *sf; if(s == nil){ s = ""; @@ -30,6 +31,7 @@ _stringnwidth(Font *f, char *s, Rune *r, int len) if(len < max) max = len; n = 0; + sf = nil; while((l = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){ if(++n > 10){ if(*r) @@ -40,19 +42,26 @@ _stringnwidth(Font *f, char *s, Rune *r, int len) name = f->name; else name = "unnamed font"; + freesubfont(sf); fprint(2, "stringwidth: bad character set for rune 0x%.4ux in %s\n", rune, name); return twid; } if(subfontname){ - if(_getsubfont(f->display, subfontname) == 0){ - def = f->display->defaultfont; + freesubfont(sf); + if((sf=_getsubfont(f->display, subfontname)) == 0){ + def = f->display ? f->display->defaultfont : nil; if(def && f!=def) f = def; else break; } + /* + * must not free sf until cachechars has found it in the cache + * and picked up its own reference. + */ } } + freesubfont(sf); agefont(f); twid += wid; len -= l; -- cgit v1.2.3