Skip to content

Commit

Permalink
[makeotfexe] Fix MarkToBase bug
Browse files Browse the repository at this point in the history
Fix afdko issue Bug in building MarkToBase lookup type 4 #811.

In fillMarkToBase(), If a base record does not have anchor for a given mark class, the logic assigns it an offset of 0. Later, in writeMarkToBase(), an offset of 0 for a base anchor record is used as a flag to write a NULL anchor record.

There are several parts to how the bug happens. First, the offset to the first mark anchor record is always zero. This is not a problem for the array of offsets to the mark anchor records, as the logic assumes these are never NULL. Second, the the anchor offset array is filled first with the mark anchor records, and then extended with the base anchor records. Third, when the base anchor records are processed, the code tries to find a match for the current base anchor record's coords in the anchor record array; if a match is found, the offset for that anchor record is used. This means that if a base anchor record's coords match the coords of the first mark anchor record, the offset for the baser anchor record will be set to the same as that of the first mark anchor record - which is zero. In writeMarkToBase(), this valid offset is then interpreted as flagging a NULL anchor.

I think this bug was added by me on 5/9/2016 commit [20af6dd], when I changed the handling of empty mark records.
  • Loading branch information
readroberts committed Jun 18, 2019
1 parent b6fd98a commit 5dde3bc
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions c/makeotf/makeotf_lib/source/hotconv/GPOS.c
Original file line number Diff line number Diff line change
Expand Up @@ -3929,7 +3929,7 @@ static void fillMarkToBase(hotCtx g, GPOSCtx h) {
for (j = 0; j < fmt->ClassCount; j++) {
if (baseAnchorArray[j] == 0xFFFFFFFFL) {
char msg[1024];
baseAnchorArray[j] = 0;
baseAnchorArray[j] = 0xFFFFFFFFL;
featGlyphDump(g, baseRec->gid, '\0', 0);
if (h->new.fileName != NULL) {
sprintf(msg, " [%s line %ld]", h->new.fileName, baseRec->lineNum);
Expand Down Expand Up @@ -4014,8 +4014,7 @@ static void writeMarkToBase(hotCtx g, GPOSCtx h, Subtable *sub) {
for (i = 0; i < fmt->BaseArray_.BaseCount; i++) {
BaseRecord *baseRec = &fmt->BaseArray_.BaseRecord[i];
for (j = 0; j < markClassCnt; j++) {
LOffset *baseAnchorArray = baseRec->BaseAnchorArray;
if (baseRec->BaseAnchorArray[j] == 0)
if (baseRec->BaseAnchorArray[j] == 0xFFFFFFFFL)
OUT2((Offset)0);
else
OUT2((Offset)(baseRec->BaseAnchorArray[j] + anchorListOffset));
Expand Down

0 comments on commit 5dde3bc

Please sign in to comment.