[OpenJDK 2D-Dev] RFR: 8132850: java.lang.ArrayIndexOutOfBoundsException during text rendering with many fonts installed

Phil Race philip.race at oracle.com
Wed Aug 5 19:15:34 UTC 2015


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.



More information about the 2d-dev mailing list