Commit Diff


commit - e354760aca2d985073b57cb2657493b399dcf603
commit + d4aef6a074bedb42ab9c400b5f998dd79bc57d00
blob - d7a9354554606fce440f96d641c7f1f2ecc26909
blob + 7aa649e849489ebf5d071b684d84e10c3dda1dfc
--- src/libdraw/font.c
+++ 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 nof
     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;
blob - bf397cb5b5f18b964e7060ca4be45d0e7bcf7bb8
blob + 1374ef31b0d8c8ddaca9f43db992966545253e84
--- src/libdraw/subfontname.c
+++ 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;
 }