diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-02-24 03:30:21 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-02-24 03:30:21 +0100 |
commit | 4235556c16d4eb0be17a4baac1801bfd92541e0a (patch) | |
tree | 58ced9cb6e705bffb823906f579fffe491cf9ac9 /sys/src/libdraw/readsubfont.c | |
parent | 5f8cacd2de0afc51a4c01a358ed087847f284dda (diff) |
libdraw: check fontchar count in openmemsubfont() and readsubfont()
Diffstat (limited to 'sys/src/libdraw/readsubfont.c')
-rw-r--r-- | sys/src/libdraw/readsubfont.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/sys/src/libdraw/readsubfont.c b/sys/src/libdraw/readsubfont.c index 5314df82d..52c191559 100644 --- a/sys/src/libdraw/readsubfont.c +++ b/sys/src/libdraw/readsubfont.c @@ -18,23 +18,22 @@ readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock) if(i == nil) return nil; } + p = nil; if(read(fd, hdr, 3*12) != 3*12){ - if(ai == nil) - freeimage(i); - werrstr("rdsubfonfile: header read error: %r"); - return nil; + werrstr("readsubfont: header read error: %r"); + goto Err; } n = atoi(hdr); + if(n <= 0 || n > 0x7fff){ + werrstr("readsubfont: bad fontchar count %d", n); + goto Err; + } p = malloc(6*(n+1)); if(p == nil) goto Err; if(read(fd, p, 6*(n+1)) != 6*(n+1)){ - werrstr("rdsubfonfile: fontchar read error: %r"); - Err: - if(ai == nil) - freeimage(i); - free(p); - return nil; + werrstr("readsubfont: fontchar read error: %r"); + goto Err; } fc = malloc(sizeof(Fontchar)*(n+1)); if(fc == nil) @@ -51,6 +50,11 @@ readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock) } free(p); return f; +Err: + if(ai == nil) + freeimage(i); + free(p); + return nil; } Subfont* |