summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/omegafonts/ligkern_routines.c
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2014-08-20 06:41:24 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2014-08-20 06:41:24 +0000
commitcf5da7c470e3fd0585f1e1bc28dc5329d8240e01 (patch)
tree9d68927b9fc598d4350886c73146fc99ffd120d9 /Build/source/texk/web2c/omegafonts/ligkern_routines.c
parentb42dedaeace1c302538059b949f97bc03dfcabd3 (diff)
texk/web2c/omegafonts: Avoid segfault with broken OFM files. Add a new test case
git-svn-id: svn://tug.org/texlive/trunk@34986 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/omegafonts/ligkern_routines.c')
-rw-r--r--Build/source/texk/web2c/omegafonts/ligkern_routines.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/Build/source/texk/web2c/omegafonts/ligkern_routines.c b/Build/source/texk/web2c/omegafonts/ligkern_routines.c
index 3a5d590613f..09488eb3655 100644
--- a/Build/source/texk/web2c/omegafonts/ligkern_routines.c
+++ b/Build/source/texk/web2c/omegafonts/ligkern_routines.c
@@ -27,6 +27,7 @@ along with Omega; if not, write to the Free Software Foundation, Inc.,
#include "ligkern_routines.h"
#include "char_routines.h"
#include "out_routines.h"
+#include "parse_ofm.h"
#include "print_routines.h"
#include "error_routines.h"
#include "header_routines.h"
@@ -246,9 +247,10 @@ print_ligkern_table(void)
else if ((activity[i] == A_ACCESSIBLE) && (r < STOP_FLAG)) {
r += i + 1;
if (r >= nl) {
- fprintf(stderr, "Ligature/kern step %u skips too far; "
- "I made it stop.\nl", i);
+ fprintf(stderr, "Bad OFM file: Ligature/kern step %u skips too far;\n"
+ "I made it stop.\n", i);
lig_kern_table[i].entries[0] = STOP_FLAG;
+ changed = TRUE;
} else
activity[r] = A_ACCESSIBLE;
}
@@ -280,13 +282,17 @@ void
print_one_lig_kern_entry(four_entries *lentry, boolean show_stop)
{
if (lentry->entries[2] >= KERN_FLAG) {
- if (ofm_level==OFM_TFM) {
- print_kerning_command(lentry->entries[1],
- kern_table[256*(lentry->entries[2]-KERN_FLAG)+lentry->entries[3]]);
- } else {
- print_kerning_command(lentry->entries[1],
- kern_table[65536*(lentry->entries[2]-KERN_FLAG)+lentry->entries[3]]);
+ unsigned r = (ofm_level==OFM_TFM ? 256 : 65536)*(lentry->entries[2]-KERN_FLAG)+lentry->entries[3];
+ fix v;
+ if (r < nk)
+ v = kern_table[r];
+ else {
+ if (show_stop == TRUE)
+ fprintf(stderr, "Bad OFM file: Kern index too large.\n");
+ v = 0;
+ changed = TRUE;
}
+ print_kerning_command(lentry->entries[1], v);
} else {
print_ligature_command(lentry->entries[2],
lentry->entries[1],
@@ -656,6 +662,7 @@ retrieve_ligkern_table(unsigned char *ofm_lig_table,
if (r >= nl) {
fprintf(stderr, "Ligature/kern starting index for boundarychar is too large;\n"
"so I removed it.\n");
+ changed = TRUE;
} else {
bchar_label = r;
activity[r] = A_ACCESSIBLE;