https://bugs.openjdk.java.net/browse/JDK-8132850
http://cr.openjdk.java.net/~prr/8132850/

The bug is an ArrayIndexOutofBoundsException when a very large set of fonts are installed on Linux.
It occurred rendering from a compositefont :

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -35127285
    at sun.font.FileFontStrike.setCachedGlyphPtr(FileFontStrike.java:520)
    at sun.font.FileFontStrike.setCachedGlyphPtr(FileFontStrike.java:537)
at sun.font.FileFontStrike.getSlot0GlyphImagePtrs(FileFontStrike.java:449)
    at sun.font.CompositeStrike.getGlyphImagePtrs(CompositeStrike.java:115)
    at sun.font.GlyphList.mapChars(GlyphList.java:272)

Note that you do not see the exception on JDK 9 because it is caught as a result of some other work, but it is seen on 8, and the underlying problems affect all releases.

There are several contributing problems :

- the native fontconfig code to accumulate the fonts was resetting the set of glyphs for each time through the loop. thus its heuristic to limit the number of slots was never met and so it would add more slots than it should.
 In addition it should limit to 256 (or fewer) anyway.

- a special case in FileFontStrike accepted a composite glyph id. These use the MS byte of the int to store a slot. Once it was > 127 then the test to see if the glyph was a slot zero glyph failed. Hence the AIIOB.

- finally for extra safety the CompositeFont constructor should ignore trailing slots that will not fit.

I could not devise a regression test since its requires a custom system config
and in any case the exception is not seen on 9 as noted above.

-phil.

Reply via email to