diff --git a/src/share/classes/sun/font/ExtendedTextSourceLabel.java b/src/share/classes/sun/font/ExtendedTextSourceLabel.java index 571d07ac3ca0b6dd8cb6df09ee008d049c498a64..6fdef170727e6ef507340e27087583c066a78a98 100644 --- a/src/share/classes/sun/font/ExtendedTextSourceLabel.java +++ b/src/share/classes/sun/font/ExtendedTextSourceLabel.java @@ -367,6 +367,9 @@ class ExtendedTextSourceLabel extends ExtendedTextLabel implements Decoration.La validate(index); float[] charinfo = getCharinfo(); index = l2v(index) * numvals; + if ((index+vish) >= charinfo.length) { + return new Rectangle2D.Float(); + } return new Rectangle2D.Float( charinfo[index + visx], charinfo[index + visy], @@ -456,6 +459,10 @@ class ExtendedTextSourceLabel extends ExtendedTextLabel implements Decoration.La int length = source.getLength(); --start; while (width >= 0 && ++start < length) { + int cidx = l2v(start) * numvals + advx; + if (cidx >= charinfo.length) { + break; // layout bailed for some reason + } float adv = charinfo[l2v(start) * numvals + advx]; width -= adv; } @@ -469,7 +476,11 @@ class ExtendedTextSourceLabel extends ExtendedTextLabel implements Decoration.La float[] charinfo = getCharinfo(); --start; while (++start < limit) { - a += charinfo[l2v(start) * numvals + advx]; + int cidx = l2v(start) * numvals + advx; + if (cidx >= charinfo.length) { + break; // layout bailed for some reason + } + a += charinfo[cidx]; } return a; diff --git a/src/share/native/sun/font/layout/LEGlyphStorage.cpp b/src/share/native/sun/font/layout/LEGlyphStorage.cpp index be5f0831b8e8b40ae167bf0146af1e6802f72e4d..e9172f2150f93bbb4b6e4fd8d13579cd864b8fce 100644 --- a/src/share/native/sun/font/layout/LEGlyphStorage.cpp +++ b/src/share/native/sun/font/layout/LEGlyphStorage.cpp @@ -584,7 +584,7 @@ le_int32 LEGlyphStorage::applyInsertions() { le_int32 growAmount = fInsertionList->getGrowAmount(); - if (growAmount == 0) { + if (growAmount <= 0) { return fGlyphCount; } @@ -613,7 +613,9 @@ le_int32 LEGlyphStorage::applyInsertions() fAuxData = (le_uint32 *)newAuxData; } - fSrcIndex = fGlyphCount - 1; + if (fGlyphCount > 0) { + fSrcIndex = fGlyphCount - 1; + } fDestIndex = newGlyphCount - 1; #if 0 @@ -653,6 +655,10 @@ le_bool LEGlyphStorage::applyInsertion(le_int32 atPosition, le_int32 count, LEGl } #endif + if (atPosition < 0 || fSrcIndex < 0 || fDestIndex < 0) { + return FALSE; + } + if (fAuxData != NULL) { le_int32 src = fSrcIndex, dest = fDestIndex; @@ -665,7 +671,7 @@ le_bool LEGlyphStorage::applyInsertion(le_int32 atPosition, le_int32 count, LEGl } } - while (fSrcIndex > atPosition) { + while (fSrcIndex > atPosition && fSrcIndex >= 0 && fDestIndex >= 0) { fGlyphs[fDestIndex] = fGlyphs[fSrcIndex]; fCharIndices[fDestIndex] = fCharIndices[fSrcIndex]; @@ -673,7 +679,7 @@ le_bool LEGlyphStorage::applyInsertion(le_int32 atPosition, le_int32 count, LEGl fSrcIndex -= 1; } - for (le_int32 i = count - 1; i >= 0; i -= 1) { + for (le_int32 i = count - 1; i >= 0 && fDestIndex >= 0; i -= 1) { fGlyphs[fDestIndex] = newGlyphs[i]; fCharIndices[fDestIndex] = fCharIndices[atPosition]; @@ -682,7 +688,7 @@ le_bool LEGlyphStorage::applyInsertion(le_int32 atPosition, le_int32 count, LEGl // the source glyph we're pointing at // just got replaced by the insertion - fSrcIndex -= 1; + fSrcIndex -= 1; return FALSE; } diff --git a/src/share/native/sun/font/layout/LookupProcessor.cpp b/src/share/native/sun/font/layout/LookupProcessor.cpp index fe7477db7303abca906b3eb5140c78d3cb558a86..29bedfa352c7aea7902588887d6694006dca1a70 100644 --- a/src/share/native/sun/font/layout/LookupProcessor.cpp +++ b/src/share/native/sun/font/layout/LookupProcessor.cpp @@ -61,7 +61,7 @@ le_uint32 LookupProcessor::applyLookupTable(const LEReferenceTo &lo delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success); - if (delta > 0 && LE_FAILURE(success)) { + if (delta > 0 || LE_FAILURE(success)) { return 1; }