OpenJDK / amber / amber
changeset 18227:7e588bf6aba5
8011257: Better Byte Component Rasters
Reviewed-by: bae, vadim, mschoene
author | prr |
---|---|
date | Mon, 08 Apr 2013 13:35:57 -0700 |
parents | 5d1f8fdc54d8 |
children | f14a008f78be |
files | jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java |
diffstat | 2 files changed, 52 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java Mon Apr 08 13:32:09 2013 -0700 +++ b/jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java Mon Apr 08 13:35:57 2013 -0700 @@ -159,7 +159,7 @@ throw new RasterFormatException("ByteBandedRasters must have"+ "BandedSampleModels"); } - verify(false); + verify(); } @@ -731,16 +731,30 @@ } /** - * Verify that the layout parameters are consistent with - * the data. If strictCheck - * is false, this method will check for ArrayIndexOutOfBounds conditions. If - * strictCheck is true, this method will check for additional error - * conditions such as line wraparound (width of a line greater than - * the scanline stride). - * @return String Error string, if the layout is incompatible with - * the data. Otherwise returns null. + * Verify that the layout parameters are consistent with the data. + * Verifies whether the data buffer has enough data for the raster, + * taking into account offsets, after ensuring all offsets are >=0. + * @throws RasterFormatException if a problem is detected. */ - private void verify (boolean strictCheck) { + private void verify() { + + /* Need to re-verify the dimensions since a sample model may be + * specified to the constructor + */ + if (width <= 0 || height <= 0 || + height > (Integer.MAX_VALUE / width)) + { + throw new RasterFormatException("Invalid raster dimension"); + } + + if (scanlineStride < 0 || + scanlineStride > (Integer.MAX_VALUE / height)) + { + // integer overflow + throw new RasterFormatException("Incorrect scanline stride: " + + scanlineStride); + } + // Make sure data for Raster is in a legal range for (int i=0; i < dataOffsets.length; i++) { if (dataOffsets[i] < 0) { @@ -750,32 +764,41 @@ } } - int maxSize = 0; - int size; + int lastScanOffset = (height - 1) * scanlineStride; + int lastPixelOffset = lastScanOffset + (width-1); + if (lastPixelOffset < lastScanOffset) { + throw new RasterFormatException("Invalid raster dimension"); + } + + int maxIndex = 0; + int index; for (int i=0; i < numDataElements; i++) { - size = (height-1)*scanlineStride + (width-1) + dataOffsets[i]; - if (size > maxSize) { - maxSize = size; + index = lastPixelOffset + dataOffsets[i]; + if (index < lastPixelOffset) { + throw new RasterFormatException("Invalid raster dimension"); + } + if (index > maxIndex) { + maxIndex = index; } } if (data.length == 1) { - if (data[0].length < maxSize*numDataElements) { + if (data[0].length <= maxIndex*numDataElements) { throw new RasterFormatException("Data array too small "+ "(it is "+data[0].length+ - " and should be "+ - (maxSize*numDataElements)+ + " and should be > "+ + (maxIndex*numDataElements)+ " )"); } } else { for (int i=0; i < numDataElements; i++) { - if (data[i].length < maxSize) { + if (data[i].length <= maxIndex) { throw new RasterFormatException("Data array too small "+ "(it is "+data[i].length+ - " and should be "+ - maxSize+" )"); + " and should be > "+ + maxIndex+" )"); } } }
--- a/jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java Mon Apr 08 13:32:09 2013 -0700 +++ b/jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java Mon Apr 08 13:35:57 2013 -0700 @@ -885,9 +885,6 @@ } } - int maxSize = 0; - int size; - // we can be sure that width and height are greater than 0 if (scanlineStride < 0 || scanlineStride > (Integer.MAX_VALUE / height)) @@ -913,6 +910,8 @@ } lastPixelOffset += lastScanOffset; + int index; + int maxIndex = 0; for (int i = 0; i < numDataElements; i++) { if (dataOffsets[i] > (Integer.MAX_VALUE - lastPixelOffset)) { throw new RasterFormatException("Incorrect band offset: " @@ -920,15 +919,15 @@ } - size = lastPixelOffset + dataOffsets[i]; + index = lastPixelOffset + dataOffsets[i]; - if (size > maxSize) { - maxSize = size; + if (index > maxIndex) { + maxIndex = index; } } - if (data.length < maxSize) { - throw new RasterFormatException("Data array too small (should be " - + maxSize + " )"); + if (data.length <= maxIndex) { + throw new RasterFormatException("Data array too small (should be > " + + maxIndex + " )"); } }