summaryrefslogtreecommitdiff
path: root/java/openjdk6/files/icedtea/security/20130416/8007667.patch
diff options
context:
space:
mode:
Diffstat (limited to 'java/openjdk6/files/icedtea/security/20130416/8007667.patch')
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8007667.patch579
1 files changed, 0 insertions, 579 deletions
diff --git a/java/openjdk6/files/icedtea/security/20130416/8007667.patch b/java/openjdk6/files/icedtea/security/20130416/8007667.patch
deleted file mode 100644
index 132760bf08ea..000000000000
--- a/java/openjdk6/files/icedtea/security/20130416/8007667.patch
+++ /dev/null
@@ -1,579 +0,0 @@
-# HG changeset patch
-# User bae
-# Date 1361823317 -14400
-# Node ID d868fe7c7618e5b55eea8dd69ee5d099c71816e0
-# Parent 6784c9903db7f65a93279ac12b7fc00c57dbaaa5
-8007667: Better image reading
-Reviewed-by: prr, jgodinez
-
-diff --git openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java openjdk/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java
---- jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java
-+++ jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java
-@@ -281,12 +281,17 @@
- * sending warnings to listeners.
- */
- protected void warningOccurred(int code) {
-- if ((code < 0) || (code > MAX_WARNING)){
-- throw new InternalError("Invalid warning index");
-- }
-- processWarningOccurred
-- ("com.sun.imageio.plugins.jpeg.JPEGImageReaderResources",
-- Integer.toString(code));
-+ cbLock.lock();
-+ try {
-+ if ((code < 0) || (code > MAX_WARNING)){
-+ throw new InternalError("Invalid warning index");
-+ }
-+ processWarningOccurred
-+ ("com.sun.imageio.plugins.jpeg.JPEGImageReaderResources",
-+ Integer.toString(code));
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- /**
-@@ -303,7 +308,12 @@
- * library warnings from being printed to stderr.
- */
- protected void warningWithMessage(String msg) {
-- processWarningOccurred(msg);
-+ cbLock.lock();
-+ try {
-+ processWarningOccurred(msg);
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- public void setInput(Object input,
-@@ -312,18 +322,55 @@
- {
- setThreadLock();
- try {
-+ cbLock.check();
-+
- super.setInput(input, seekForwardOnly, ignoreMetadata);
- this.ignoreMetadata = ignoreMetadata;
- resetInternalState();
- iis = (ImageInputStream) input; // Always works
-- setSource(structPointer, iis);
-+ setSource(structPointer);
- } finally {
- clearThreadLock();
- }
- }
-
-- private native void setSource(long structPointer,
-- ImageInputStream source);
-+ /**
-+ * This method is called from native code in order to fill
-+ * native input buffer.
-+ *
-+ * We block any attempt to change the reading state during this
-+ * method, in order to prevent a corruption of the native decoder
-+ * state.
-+ *
-+ * @return number of bytes read from the stream.
-+ */
-+ private int readInputData(byte[] buf, int off, int len) throws IOException {
-+ cbLock.lock();
-+ try {
-+ return iis.read(buf, off, len);
-+ } finally {
-+ cbLock.unlock();
-+ }
-+ }
-+
-+ /**
-+ * This method is called from the native code in order to
-+ * skip requested number of bytes in the input stream.
-+ *
-+ * @param n
-+ * @return
-+ * @throws IOException
-+ */
-+ private long skipInputBytes(long n) throws IOException {
-+ cbLock.lock();
-+ try {
-+ return iis.skipBytes(n);
-+ } finally {
-+ cbLock.unlock();
-+ }
-+ }
-+
-+ private native void setSource(long structPointer);
-
- private void checkTablesOnly() throws IOException {
- if (debug) {
-@@ -375,6 +422,8 @@
- public int getNumImages(boolean allowSearch) throws IOException {
- setThreadLock();
- try { // locked thread
-+ cbLock.check();
-+
- return getNumImagesOnThread(allowSearch);
- } finally {
- clearThreadLock();
-@@ -574,8 +623,13 @@
- if (debug) {
- System.out.println("pushing back " + num + " bytes");
- }
-- iis.seek(iis.getStreamPosition()-num);
-- // The buffer is clear after this, so no need to set haveSeeked.
-+ cbLock.lock();
-+ try {
-+ iis.seek(iis.getStreamPosition()-num);
-+ // The buffer is clear after this, so no need to set haveSeeked.
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- /**
-@@ -645,7 +699,12 @@
- * Ignore this profile.
- */
- iccCS = null;
-- warningOccurred(WARNING_IGNORE_INVALID_ICC);
-+ cbLock.lock();
-+ try {
-+ warningOccurred(WARNING_IGNORE_INVALID_ICC);
-+ } finally {
-+ cbLock.unlock();
-+ }
-
- return;
- }
-@@ -680,6 +739,7 @@
- setThreadLock();
- try {
- if (currentImage != imageIndex) {
-+ cbLock.check();
- readHeader(imageIndex, true);
- }
- return width;
-@@ -692,6 +752,7 @@
- setThreadLock();
- try {
- if (currentImage != imageIndex) {
-+ cbLock.check();
- readHeader(imageIndex, true);
- }
- return height;
-@@ -720,6 +781,8 @@
- setThreadLock();
- try {
- if (currentImage != imageIndex) {
-+ cbLock.check();
-+
- readHeader(imageIndex, true);
- }
-
-@@ -743,6 +806,7 @@
- private Iterator getImageTypesOnThread(int imageIndex)
- throws IOException {
- if (currentImage != imageIndex) {
-+ cbLock.check();
- readHeader(imageIndex, true);
- }
-
-@@ -944,6 +1008,7 @@
- setThreadLock();
- try {
- if (!tablesOnlyChecked) {
-+ cbLock.check();
- checkTablesOnly();
- }
- return streamMetadata;
-@@ -964,6 +1029,8 @@
- return imageMetadata;
- }
-
-+ cbLock.check();
-+
- gotoImage(imageIndex);
-
- imageMetadata = new JPEGMetadata(false, false, iis, this);
-@@ -980,6 +1047,7 @@
- throws IOException {
- setThreadLock();
- try {
-+ cbLock.check();
- try {
- readInternal(imageIndex, param, false);
- } catch (RuntimeException e) {
-@@ -1209,58 +1277,63 @@
- }
- target.setRect(destROI.x, destROI.y + y, raster);
-
-- processImageUpdate(image,
-- destROI.x, destROI.y+y,
-- raster.getWidth(), 1,
-- 1, 1,
-- destinationBands);
-- if ((y > 0) && (y%progInterval == 0)) {
-- int height = target.getHeight()-1;
-- float percentOfPass = ((float)y)/height;
-- if (progressive) {
-- if (knownPassCount != UNKNOWN) {
-- processImageProgress((pass + percentOfPass)*100.0F
-- / knownPassCount);
-- } else if (maxProgressivePass != Integer.MAX_VALUE) {
-- // Use the range of allowed progressive passes
-- processImageProgress((pass + percentOfPass)*100.0F
-- / (maxProgressivePass - minProgressivePass + 1));
-+ cbLock.lock();
-+ try {
-+ processImageUpdate(image,
-+ destROI.x, destROI.y+y,
-+ raster.getWidth(), 1,
-+ 1, 1,
-+ destinationBands);
-+ if ((y > 0) && (y%progInterval == 0)) {
-+ int height = target.getHeight()-1;
-+ float percentOfPass = ((float)y)/height;
-+ if (progressive) {
-+ if (knownPassCount != UNKNOWN) {
-+ processImageProgress((pass + percentOfPass)*100.0F
-+ / knownPassCount);
-+ } else if (maxProgressivePass != Integer.MAX_VALUE) {
-+ // Use the range of allowed progressive passes
-+ processImageProgress((pass + percentOfPass)*100.0F
-+ / (maxProgressivePass - minProgressivePass + 1));
-+ } else {
-+ // Assume there are a minimum of MIN_ESTIMATED_PASSES
-+ // and that there is always one more pass
-+ // Compute the percentage as the percentage at the end
-+ // of the previous pass, plus the percentage of this
-+ // pass scaled to be the percentage of the total remaining,
-+ // assuming a minimum of MIN_ESTIMATED_PASSES passes and
-+ // that there is always one more pass. This is monotonic
-+ // and asymptotic to 1.0, which is what we need.
-+ int remainingPasses = // including this one
-+ Math.max(2, MIN_ESTIMATED_PASSES-pass);
-+ int totalPasses = pass + remainingPasses-1;
-+ progInterval = Math.max(height/20*totalPasses,
-+ totalPasses);
-+ if (y%progInterval == 0) {
-+ percentToDate = previousPassPercentage +
-+ (1.0F - previousPassPercentage)
-+ * (percentOfPass)/remainingPasses;
-+ if (debug) {
-+ System.out.print("pass= " + pass);
-+ System.out.print(", y= " + y);
-+ System.out.print(", progInt= " + progInterval);
-+ System.out.print(", % of pass: " + percentOfPass);
-+ System.out.print(", rem. passes: "
-+ + remainingPasses);
-+ System.out.print(", prev%: "
-+ + previousPassPercentage);
-+ System.out.print(", %ToDate: " + percentToDate);
-+ System.out.print(" ");
-+ }
-+ processImageProgress(percentToDate*100.0F);
-+ }
-+ }
- } else {
-- // Assume there are a minimum of MIN_ESTIMATED_PASSES
-- // and that there is always one more pass
-- // Compute the percentage as the percentage at the end
-- // of the previous pass, plus the percentage of this
-- // pass scaled to be the percentage of the total remaining,
-- // assuming a minimum of MIN_ESTIMATED_PASSES passes and
-- // that there is always one more pass. This is monotonic
-- // and asymptotic to 1.0, which is what we need.
-- int remainingPasses = // including this one
-- Math.max(2, MIN_ESTIMATED_PASSES-pass);
-- int totalPasses = pass + remainingPasses-1;
-- progInterval = Math.max(height/20*totalPasses,
-- totalPasses);
-- if (y%progInterval == 0) {
-- percentToDate = previousPassPercentage +
-- (1.0F - previousPassPercentage)
-- * (percentOfPass)/remainingPasses;
-- if (debug) {
-- System.out.print("pass= " + pass);
-- System.out.print(", y= " + y);
-- System.out.print(", progInt= " + progInterval);
-- System.out.print(", % of pass: " + percentOfPass);
-- System.out.print(", rem. passes: "
-- + remainingPasses);
-- System.out.print(", prev%: "
-- + previousPassPercentage);
-- System.out.print(", %ToDate: " + percentToDate);
-- System.out.print(" ");
-- }
-- processImageProgress(percentToDate*100.0F);
-- }
-+ processImageProgress(percentOfPass * 100.0F);
- }
-- } else {
-- processImageProgress(percentOfPass * 100.0F);
-- }
-+ }
-+ } finally {
-+ cbLock.unlock();
- }
- }
-
-@@ -1273,33 +1346,58 @@
- }
-
- private void passStarted (int pass) {
-- this.pass = pass;
-- previousPassPercentage = percentToDate;
-- processPassStarted(image,
-- pass,
-- minProgressivePass,
-- maxProgressivePass,
-- 0, 0,
-- 1,1,
-- destinationBands);
-+ cbLock.lock();
-+ try {
-+ this.pass = pass;
-+ previousPassPercentage = percentToDate;
-+ processPassStarted(image,
-+ pass,
-+ minProgressivePass,
-+ maxProgressivePass,
-+ 0, 0,
-+ 1,1,
-+ destinationBands);
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- private void passComplete () {
-- processPassComplete(image);
-+ cbLock.lock();
-+ try {
-+ processPassComplete(image);
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- void thumbnailStarted(int thumbnailIndex) {
-- processThumbnailStarted(currentImage, thumbnailIndex);
-+ cbLock.lock();
-+ try {
-+ processThumbnailStarted(currentImage, thumbnailIndex);
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- // Provide access to protected superclass method
- void thumbnailProgress(float percentageDone) {
-- processThumbnailProgress(percentageDone);
-+ cbLock.lock();
-+ try {
-+ processThumbnailProgress(percentageDone);
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- // Provide access to protected superclass method
- void thumbnailComplete() {
-- processThumbnailComplete();
-+ cbLock.lock();
-+ try {
-+ processThumbnailComplete();
-+ } finally {
-+ cbLock.unlock();
-+ }
- }
-
- /**
-@@ -1323,6 +1421,11 @@
- public void abort() {
- setThreadLock();
- try {
-+ /**
-+ * NB: we do not check the call back lock here,
-+ * we allow to abort the reader any time.
-+ */
-+
- super.abort();
- abortRead(structPointer);
- } finally {
-@@ -1345,6 +1448,7 @@
- setThreadLock();
- Raster retval = null;
- try {
-+ cbLock.check();
- /*
- * This could be further optimized by not resetting the dest.
- * offset and creating a translated raster in readInternal()
-@@ -1384,6 +1488,8 @@
- public int getNumThumbnails(int imageIndex) throws IOException {
- setThreadLock();
- try {
-+ cbLock.check();
-+
- getImageMetadata(imageIndex); // checks iis state for us
- // Now check the jfif segments
- JFIFMarkerSegment jfif =
-@@ -1404,6 +1510,8 @@
- throws IOException {
- setThreadLock();
- try {
-+ cbLock.check();
-+
- if ((thumbnailIndex < 0)
- || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
- throw new IndexOutOfBoundsException("No such thumbnail");
-@@ -1422,6 +1530,8 @@
- throws IOException {
- setThreadLock();
- try {
-+ cbLock.check();
-+
- if ((thumbnailIndex < 0)
- || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
- throw new IndexOutOfBoundsException("No such thumbnail");
-@@ -1441,6 +1551,8 @@
- throws IOException {
- setThreadLock();
- try {
-+ cbLock.check();
-+
- if ((thumbnailIndex < 0)
- || (thumbnailIndex >= getNumThumbnails(imageIndex))) {
- throw new IndexOutOfBoundsException("No such thumbnail");
-@@ -1481,6 +1593,7 @@
- public void reset() {
- setThreadLock();
- try {
-+ cbLock.check();
- super.reset();
- } finally {
- clearThreadLock();
-@@ -1492,6 +1605,8 @@
- public void dispose() {
- setThreadLock();
- try {
-+ cbLock.check();
-+
- if (structPointer != 0) {
- disposerRecord.dispose();
- structPointer = 0;
-@@ -1553,4 +1668,34 @@
- theThread = null;
- }
- }
-+
-+ private CallBackLock cbLock = new CallBackLock();
-+
-+ private static class CallBackLock {
-+
-+ private State lockState;
-+
-+ CallBackLock() {
-+ lockState = State.Unlocked;
-+ }
-+
-+ void check() {
-+ if (lockState != State.Unlocked) {
-+ throw new IllegalStateException("Access to the reader is not allowed");
-+ }
-+ }
-+
-+ private void lock() {
-+ lockState = State.Locked;
-+ }
-+
-+ private void unlock() {
-+ lockState = State.Unlocked;
-+ }
-+
-+ private static enum State {
-+ Unlocked,
-+ Locked
-+ }
-+ }
- }
-diff --git openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c openjdk/jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
---- jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
-+++ jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
-@@ -57,8 +57,8 @@
- #define MAX(a,b) ((a) > (b) ? (a) : (b))
-
- /* Cached Java method ids */
--static jmethodID ImageInputStream_readID;
--static jmethodID ImageInputStream_skipBytesID;
-+static jmethodID JPEGImageReader_readInputDataID;
-+static jmethodID JPEGImageReader_skipInputBytesID;
- static jmethodID JPEGImageReader_warningOccurredID;
- static jmethodID JPEGImageReader_warningWithMessageID;
- static jmethodID JPEGImageReader_setImageDataID;
-@@ -923,7 +923,7 @@ imageio_fill_input_buffer(j_decompress_p
- RELEASE_ARRAYS(env, data, src->next_input_byte);
- ret = (*env)->CallIntMethod(env,
- sb->stream,
-- ImageInputStream_readID,
-+ JPEGImageReader_readInputDataID,
- sb->hstreamBuffer, 0,
- sb->bufferLength);
- if ((*env)->ExceptionOccurred(env)
-@@ -1013,7 +1013,7 @@ imageio_fill_suspended_buffer(j_decompre
- }
-
- ret = (*env)->CallIntMethod(env, sb->stream,
-- ImageInputStream_readID,
-+ JPEGImageReader_readInputDataID,
- sb->hstreamBuffer,
- offset, buflen);
- if ((*env)->ExceptionOccurred(env)
-@@ -1107,7 +1107,7 @@ imageio_skip_input_data(j_decompress_ptr
- RELEASE_ARRAYS(env, data, src->next_input_byte);
- ret = (*env)->CallLongMethod(env,
- sb->stream,
-- ImageInputStream_skipBytesID,
-+ JPEGImageReader_skipInputBytesID,
- (jlong) num_bytes);
- if ((*env)->ExceptionOccurred(env)
- || !GET_ARRAYS(env, data, &(src->next_input_byte))) {
-@@ -1382,13 +1382,13 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
- jclass qTableClass,
- jclass huffClass) {
-
-- ImageInputStream_readID = (*env)->GetMethodID(env,
-- ImageInputStreamClass,
-- "read",
-+ JPEGImageReader_readInputDataID = (*env)->GetMethodID(env,
-+ cls,
-+ "readInputData",
- "([BII)I");
-- ImageInputStream_skipBytesID = (*env)->GetMethodID(env,
-- ImageInputStreamClass,
-- "skipBytes",
-+ JPEGImageReader_skipInputBytesID = (*env)->GetMethodID(env,
-+ cls,
-+ "skipInputBytes",
- "(J)J");
- JPEGImageReader_warningOccurredID = (*env)->GetMethodID(env,
- cls,
-@@ -1531,8 +1531,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
- Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_setSource
- (JNIEnv *env,
- jobject this,
-- jlong ptr,
-- jobject source) {
-+ jlong ptr) {
-
- imageIODataPtr data = (imageIODataPtr)jlong_to_ptr(ptr);
- j_common_ptr cinfo;
-@@ -1546,7 +1545,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGIm
-
- cinfo = data->jpegObj;
-
-- imageio_set_stream(env, cinfo, data, source);
-+ imageio_set_stream(env, cinfo, data, this);
-
- imageio_init_source((j_decompress_ptr) cinfo);
- }