ref: 57e2ed362dfe517efe02504426e9220892a159c3
parent: 5a590125a2830e7106fa78dacb0e1a9991f8a4cb
author: Ali Gholami Rudi <ali@rudi.ir>
date: Sun Jun 23 18:04:55 EDT 2013
font: do not read more than NKERNS kerning pairs
--- a/font.c
+++ b/font.c
@@ -39,11 +39,13 @@
struct glyph *glyph = NULL;
struct glyph *prev = NULL;
int wid, type;
- while (fn->n < NGLYPHS) {
- if (fscanf(fin, "%s", name) != 1)
- break;
+ while (fscanf(fin, "%s", name) == 1) {
if (!font_section(fn, fin, name))
break;
+ if (fn->n >= NGLYPHS) {
+ skipline(fin);
+ continue;
+ }
fscanf(fin, "%s", tok);
glyph = prev;
if (strcmp("\"", tok)) {
@@ -68,17 +70,17 @@
{
char c1[ILNLEN], c2[ILNLEN];
int val;
- while (fn->n < NGLYPHS) {
- if (fscanf(fin, "%s", c1) != 1)
- break;
+ while (fscanf(fin, "%s", c1) == 1) {
if (!font_section(fn, fin, c1))
break;
if (fscanf(fin, "%s %d", c2, &val) != 2)
break;
- strcpy(fn->kern_c1[fn->nkern], c1);
- strcpy(fn->kern_c2[fn->nkern], c2);
- fn->kern[fn->nkern] = val;
- fn->nkern++;
+ if (fn->nkern < NKERNS) {
+ strcpy(fn->kern_c1[fn->nkern], c1);
+ strcpy(fn->kern_c2[fn->nkern], c2);
+ fn->kern[fn->nkern] = val;
+ fn->nkern++;
+ }
}
}
@@ -140,7 +142,7 @@
continue;
}
if (!strcmp("fontname", tok)) {
- skipline(fin);
+ fscanf(fin, "%s", fn->fontname);
continue;
}
if (!strcmp("named", tok)) {
--- a/roff.h
+++ b/roff.h
@@ -78,8 +78,8 @@
extern int dev_ver;
struct glyph {
- char name[FNLEN]; /* name of the glyph */
- char id[FNLEN]; /* device-dependent glyph identifier */
+ char name[GNLEN]; /* name of the glyph */
+ char id[GNLEN]; /* device-dependent glyph identifier */
struct font *font; /* glyph font */
int wid; /* character width */
int type; /* character type; ascender/descender */
@@ -87,6 +87,7 @@
struct font {
char name[FNLEN];
+ char fontname[FNLEN];
struct glyph glyphs[NGLYPHS];
int nglyphs;
int spacewid;