plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

commit d4aef6a074bedb42ab9c400b5f998dd79bc57d00
parent e354760aca2d985073b57cb2657493b399dcf603
Author: rsc <devnull@localhost>
Date:   Thu, 12 May 2005 16:55:14 +0000

handle arbitrary length names in subfontname.
handle overflow in offset computation in font.c

Diffstat:
Msrc/libdraw/font.c | 8+++++---
Msrc/libdraw/subfontname.c | 22+++++++++++++---------
2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/libdraw/font.c b/src/libdraw/font.c @@ -177,7 +177,7 @@ int loadchar(Font *f, Rune r, Cacheinfo *c, int h, int noflush, char **subfontname) { int i, oi, wid, top, bottom; - Rune pic; + int pic; /* need >16 bits for adding offset below */ Fontchar *fi; Cachefont *cf; Cachesubf *subf, *of; @@ -270,10 +270,12 @@ loadchar(Font *f, Rune r, Cacheinfo *c, int h, int noflush, char **subfontname) Found2: subf->age = f->age; + /* possible overflow here, but works out okay */ pic += cf->offset; - if(pic-cf->min >= subf->f->n) + pic -= cf->min; + if(pic >= subf->f->n) goto TryPJW; - fi = &subf->f->info[pic - cf->min]; + fi = &subf->f->info[pic]; if(fi->width == 0) goto TryPJW; wid = (fi+1)->x - fi->x; diff --git a/src/libdraw/subfontname.c b/src/libdraw/subfontname.c @@ -9,20 +9,22 @@ char* subfontname(char *cfname, char *fname, int maxdepth) { - char *t, *u, tmp1[64], tmp2[64]; + char *t, *u, *tmp1, *tmp2; int i; + t = strdup(cfname); /* t is the return string */ if(strcmp(cfname, "*default*") == 0) - return strdup(cfname); - t = cfname; + return t; if(t[0] != '/'){ - snprint(tmp2, sizeof tmp2, "%s", fname); + tmp2 = strdup(fname); u = utfrrune(tmp2, '/'); if(u) u[0] = 0; else strcpy(tmp2, "."); - snprint(tmp1, sizeof tmp1, "%s/%s", tmp2, t); + tmp1 = smprint("%s/%s", tmp2, t); + free(tmp2); + free(t); t = tmp1; } @@ -33,14 +35,16 @@ subfontname(char *cfname, char *fname, int maxdepth) if((1<<i) > maxdepth) continue; /* try i-bit grey */ - snprint(tmp2, sizeof tmp2, "%s.%d", t, i); - if(access(tmp2, AREAD) == 0) - return strdup(tmp2); + tmp2 = smprint("%s.%d", t, i); + if(access(tmp2, AREAD) == 0) { + free(t); + return tmp2; + } } /* try default */ if(access(t, AREAD) == 0) - return strdup(t); + return t; return nil; }