[OS X TeX] A Fix for the Corrupt Font Cache Bug (2)
Richard Koch
koch at math.uoregon.edu
Mon Apr 6 17:36:16 CEST 2009
Folks,
Many of you are aware of the ``corrupt font cache bug'' on Mac OS X.
While typesetting a document, the display of the output pdf suddenly
develops problems. Exact symptoms vary --- sometimes half of the
mathematical characters are missing, and sometimes the text
mysteriously changes from Computer Modern to Helvetica. When the
problem occurs, it is visible in many programs at once: Preview,
TeXShop, LaTeXiT, TeXniscope, etc. But the pdf file displays correctly
in Adobe Acrobat. Quitting and restarting programs does not help, but
rebooting the machine usually solves the problem. An even better way
to rebuild the cache is to issue the following commands in Terminal:
atsutil databases -removeUser
atsutil server -shutdown
The seriousness of the bug depends on usage patterns. Many of us see
the problem once in six months or less, reboot, and merrily resume
typesetting. But others encounter it much more often.
This problem is caused by a corrupt font cache. When GUI programs
display pdf files, they call Apple's internal pdf routines. In turn,
these routines call Apple's font routines to construct bitmaps for the
outline fonts. These Apple routines store the bitmaps in a font cache
to speed up future display. For reasons unknown until recently, this
font cache can become corrupt; this is ``triggered'' by displaying a
defective pdf file. After that trigger, display problems persist for
all files. To fix the problem, the font cache needs to be rebuilt, as
happens when the machine is rebooted. Adobe Acrobat does not use
Apple's pdf display routines, so it is immune to the bug.
The bug doesn't occur when running TeX on other platforms. This caused
many of us to conclude that the problem was due to a bug in OS X, and
several developers contacted Apple about the bug. But most developers
had no reliable trigger file.
In a heroic debugging campaign a couple of weeks ago, Melissa O'Neill,
the author of the program ``PDF to Keynote'', traced the bug to a
particular line of code in pdftex. The details will be given in a
subsequent email; suffice it to say that pdftex source code contained
the symbol > in a spot where >= was required. This bug has been
present in pdftex since 2004.
Despite the evidence, the bug is in pdftex and dvips, not in OS X.
Without providing complete details, let me explain how that could
happen. When pdf files are created, the fonts are added to the
document but only the subset of characters actually used are placed in
the pdf file. Outline font files often contain subroutines which draw
commonly used portions of characters. When creating subsets of these
fonts, some of these subroutines will be ``orphaned'' and no longer
called by the remaining characters. Such orphaned routines should be
replaced by RETURN in the font subset, but instead they were being
replaced with ``meaningful junk'' in certain circumstances.
Since we do not have access to Apple's code, the rest of the
explanation is a conjecture. We conjecture that Apple optimized its
font routines to call subroutines once at the start rather than many
times during expansion of individual characters. This optimization
then called the incorrectly orphaned routines, even though the
characters required for the document didn't need them. The problem
didn't occur on other platforms because their font routines had not
been optimized in this way.
Once you install the repaired pdftex and dvips binaries, pdf files
created by these programs will not contain damaged fonts and thus
won't trigger the bug. But unfortunately, your old pdf files may still
be damaged. In addition, users on other platforms won't have the
repaired binaries for some time, so pdf files sent by colleagues may
still be damaged and trigger the bug. That is why you may still
experience the bug from time to time until the TeX world catches up.
It isn't even necessary to display an old damaged pdf file to trigger
the bug, because Apple's QuickLook software and the software in Finder
which gives a miniature version of the first page in the file browser
can trigger it. If you keep experiencing the bug after applying the
fix, you may need to retypeset files which you often open.
After the initial bug was discovered, an informal debugging team of
Melissa O'Neill, Thanh The Han, the author of pdftex, and
Jin-Hwan Cho, the author of dvipdfmx, began systematically examining
other programs and files in TeX. I'll try to summarize some of their
work in the final email. Suffice it to say that they discovered a
large number of broken font files in TeX. These fonts contained
subroutines which did not end with RETURN, even though the Adobe font
specification requires this. Knuth's Computer Modern files and their
modern Type 1 forms don't have this problem. Files created with the
defective fonts could also trigger the bug. Thanh then patched pdftex
to make it automatically add the missing RETURN when a defective font
is used. Thus if a broken font is used by the patched pdftex or dvips,
it will not cause problems.
Later debugging discovered the font utility in TeX which created these
incorrect fonts; that utility has been patched. But still later, a
number of other TeX fonts were discovered which did not pass
consistency tests for correctness. We don't know if these fonts
trigger the bug.
It is possible that other fonts not associated with TeX corrupt the
font cache. The debugging team doesn't want to let Apple off the hook,
stating ``the right response to invalid data isn't to behave in
arbitrary ways.'' You can be sure that Apple will be contacted with
definitive information about our TeX experience.
The incorrect fonts can be updated by tlmgr and TeX Live Utility, so
gradually these font problems will go away. If you do not have TeX
Live Utility, you can obtain it at
http://code.google.com/p/mactlmgr
All of the programs, utilities, and fonts will be correct in TeX Live
2009 when it appears, so we urge users to upgrade to it.
The code containing the pdftex bug was used with little change in
modern versions of dvips, so fixing the bug in dvips was not
difficult. However, it wasn't so easy to find the corresponding code
in luatex and metapost. Instead of waiting for decisive fixes in these
programs, we decided to just release the fixed pdftex and dvips. This
should fix the bug for most users. Notice that pdftex is used when
typesetting in ``pdftex'' mode and dvips is used when typesetting in
``TeX and DVI'' mode. XeTeX does not have the bug.
Finally, some of you may wonder why tlmgr does not upgrade binary
files. TeX Live binaries are made by a team of many volunteers, most
responsible for a single platform. These people work over the course
of months as TeX Live goes into final production. If TeX Live were to
upgrade binaries continuously, the team would have to operate
throughout the year, which is not a realistic requirement.
In addition, the authors of TeX Live use the interval between releases
to revise the build scheme and make sure that all of the binary
components of TeX Live remain compatible. TeX Live does not depend on
specific library files in your operating system. Instead it contains
its own version of these libraries, so the entire TeX system operates
in a sort of ``box'' immune from changes in your system. Keeping this
box internally consistent is a difficult task, and is the main reason
that the core of TeX Live is released once a year (with upgrades via
tlmgr for fonts, style files, etc.) rather than dribbling out over time.
Dick Koch
More information about the macostex-archives
mailing list