diff options
author | Philipp Gesang <phg@phi-gamma.net> | 2016-05-25 07:39:53 +0200 |
---|---|---|
committer | Philipp Gesang <phg@phi-gamma.net> | 2016-05-25 07:39:56 +0200 |
commit | e62c662512440af0ebc4ce1f4fe81a51fc4888a3 (patch) | |
tree | 06931d15b67c8248a088b9882dc4cde894b90903 | |
parent | 274ca61bf7ea43543c5aea53873f22c8b598b4a9 (diff) | |
download | luaotfload-e62c662512440af0ebc4ce1f4fe81a51fc4888a3.tar.gz |
[fontloader] import fix by Hans for crashes with ancient Linotype Palatino files
The crash happens with these broken files MS used to ship:
beef66370e7124eb683514ad9ad07576 palabi.ttf
975972a205fd91a532d1b7433281af70 palab.ttf
be4590eba976dace111b6686f6dade52 palai.ttf
96261bb90c9babbf8042ce7f43200d65 pala.ttf
on account of a broken rule in the “s_s_l” lookup. The change removes
the entire lookup in this case since otherwise the rest of the font
behaves *very* strange.
-rw-r--r-- | src/fontloader/misc/fontloader-font-dsp.lua | 65 |
1 files changed, 39 insertions, 26 deletions
diff --git a/src/fontloader/misc/fontloader-font-dsp.lua b/src/fontloader/misc/fontloader-font-dsp.lua index e35d6da..e265f48 100644 --- a/src/fontloader/misc/fontloader-font-dsp.lua +++ b/src/fontloader/misc/fontloader-font-dsp.lua @@ -1598,6 +1598,14 @@ do local reported = { } + local function report_issue(i,what,sequence,kind) + local name = sequence.name + if not reported[name] then + report("rule %i in %s lookup %a has %s lookups",i,what,name,kind) + reported[name] = true + end + end + for i=lastsequence+1,nofsequences do local sequence = sequences[i] local steps = sequence.steps @@ -1609,18 +1617,10 @@ do local rule = rules[i] local rlookups = rule.lookups if not rlookups then - local name = sequence.name - if not reported[name] then - report("rule %i in %s lookup %a has %s lookups",i,what,name,"no") - reported[name] = true - end + report_issue(i,what,sequence,"no") elseif not next(rlookups) then - local name = sequence.name - if not reported[name] then - -- can be ok as it aborts a chain sequence - report("rule %i in %s lookup %a has %s lookups",i,what,name,"empty") - reported[name] = true - end + -- can be ok as it aborts a chain sequence + report_issue(i,what,sequence,"empty") rule.lookups = nil else for index, lookupid in sortedhash(rlookups) do -- nicer @@ -1630,21 +1630,34 @@ do -- as in another one nofsublookups = nofsublookups + 1 -- report("registering %i as sublookup %i",lookupid,nofsublookups) - local d = lookups[lookupid].done - h = { - index = nofsublookups, -- handy for tracing - name = f_lookupname(lookupprefix,"d",lookupid+lookupidoffset), - derived = true, -- handy for tracing - steps = d.steps, - nofsteps = d.nofsteps, - type = d.lookuptype, - markclass = d.markclass or nil, - flags = d.flags, - -- chain = d.chain, - } - sublookuplist[nofsublookups] = h - sublookuphash[lookupid] = nofsublookups - sublookupcheck[lookupid] = 1 + local lookup = lookups[lookupid] + if lookup then + local d = lookup.done + if d then + h = { + index = nofsublookups, -- handy for tracing + name = f_lookupname(lookupprefix,"d",lookupid+lookupidoffset), + derived = true, -- handy for tracing + steps = d.steps, + nofsteps = d.nofsteps, + type = d.lookuptype, + markclass = d.markclass or nil, + flags = d.flags, + -- chain = d.chain, + } + sublookuplist[nofsublookups] = h + sublookuphash[lookupid] = nofsublookups + sublookupcheck[lookupid] = 1 + else + report_issue(i,what,sequence,"missing") + rule.lookups = nil + break + end + else + report_issue(i,what,sequence,"bad") + rule.lookups = nil + break + end else sublookupcheck[lookupid] = sublookupcheck[lookupid] + 1 end |