Mercurial > hg > jdk9-shenandoah > jdk
changeset 12637:b1d64eb06735
8132850: java.lang.ArrayIndexOutOfBoundsException during text rendering with many fonts installed
Reviewed-by: jgodinez, serb
author | prr |
---|---|
date | Thu, 13 Aug 2015 12:12:10 -0700 |
parents | 6fff1612dd3c |
children | df4b74d0e6ee |
files | src/java.desktop/share/classes/sun/font/CompositeFont.java src/java.desktop/share/classes/sun/font/FileFontStrike.java src/java.desktop/unix/native/common/awt/fontpath.c |
diffstat | 3 files changed, 13 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/java.desktop/share/classes/sun/font/CompositeFont.java Thu Aug 13 16:26:17 2015 +0300 +++ b/src/java.desktop/share/classes/sun/font/CompositeFont.java Thu Aug 13 12:12:10 2015 -0700 @@ -71,6 +71,13 @@ } else { numSlots = componentNames.length; } + /* We will limit the number of slots to 254. + * We store the slot for a glyph id in a byte and we may use one slot + * for an EUDC font, and we may also create a composite + * using this composite as a backup for a physical font. + * So we want to leave space for the two additional slots. + */ + numSlots = (numSlots <= 254) ? numSlots : 254; /* Only the first "numMetricsSlots" slots are used for font metrics. * the rest are considered "fallback" slots".
--- a/src/java.desktop/share/classes/sun/font/FileFontStrike.java Thu Aug 13 16:26:17 2015 +0300 +++ b/src/java.desktop/share/classes/sun/font/FileFontStrike.java Thu Aug 13 12:12:10 2015 -0700 @@ -420,14 +420,13 @@ /* The following method is called from CompositeStrike as a special case. */ - private static final int SLOTZEROMAX = 0xffffff; int getSlot0GlyphImagePtrs(int[] glyphCodes, long[] images, int len) { int convertedCnt = 0; for (int i=0; i<len; i++) { int glyphCode = glyphCodes[i]; - if (glyphCode >= SLOTZEROMAX) { + if (glyphCode >>> 24 != 0) { return convertedCnt; } else { convertedCnt++;
--- a/src/java.desktop/unix/native/common/awt/fontpath.c Thu Aug 13 16:26:17 2015 +0300 +++ b/src/java.desktop/unix/native/common/awt/fontpath.c Thu Aug 13 12:12:10 2015 -0700 @@ -1219,10 +1219,11 @@ minGlyphs = val; } } + FcCharSet *unionCharset = NULL; for (j=0; j<nfonts; j++) { FcPattern *fontPattern = fontset->fonts[j]; FcChar8 *fontformat; - FcCharSet *unionCharset = NULL, *charset; + FcCharSet *charset = NULL; fontformat = NULL; (*FcPatternGetString)(fontPattern, FC_FONTFORMAT, 0, &fontformat); @@ -1280,6 +1281,9 @@ if (!includeFallbacks) { break; } + if (fontCount == 254) { + break; // CompositeFont will only use up to 254 slots from here. + } } /* Once we get here 'fontCount' is the number of returned fonts