< prev index next >
src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 214,223 ****
--- 214,228 ----
/**
* Set to true once stream has been checked for stream metadata
*/
private boolean tablesOnlyChecked = false;
+ /**
+ * Set to true if the input stream contains only a tables-only image.
+ */
+ private boolean tablesOnlyStream = false;
+
/** The referent to be registered with the Disposer. */
private Object disposerReferent = new Object();
/** The DisposerRecord that handles the actual disposal of this reader. */
private DisposerRecord disposerRecord;
*** 289,298 ****
--- 294,304 ----
super.setInput(input, seekForwardOnly, ignoreMetadata);
this.ignoreMetadata = ignoreMetadata;
resetInternalState();
iis = (ImageInputStream) input; // Always works
setSource(structPointer);
+ tablesOnlyStream = false;
} finally {
clearThreadLock();
}
}
*** 362,382 ****
if (debug) {
System.out.println
("pos after constructing stream metadata is " + pos);
}
}
! // Now we are at the first image if there are any, so add it
! // to the list
if (hasNextImage()) {
imagePositions.add(iis.getStreamPosition());
}
} else { // Not tables only, so add original pos to the list
imagePositions.add(savePos);
// And set current image since we've read it now
currentImage = 0;
}
! if (seekForwardOnly) {
Long pos = imagePositions.get(imagePositions.size()-1);
iis.flushBefore(pos.longValue());
}
tablesOnlyChecked = true;
}
--- 368,403 ----
if (debug) {
System.out.println
("pos after constructing stream metadata is " + pos);
}
}
! /* Now we are at the first image if there are any, so add it
! * to the list.
! */
if (hasNextImage()) {
imagePositions.add(iis.getStreamPosition());
+ } else {
+ /*
+ * if there is no image data after reading the first tables-only
+ * image, we should store this state so that if user tries
+ * to read image data from this input stream we should throw
+ * an IIOException in gotoImage(int) function.
+ */
+ tablesOnlyStream = true;
}
} else { // Not tables only, so add original pos to the list
imagePositions.add(savePos);
// And set current image since we've read it now
currentImage = 0;
}
! /*
! * If imagePositions list doesn't contain any image stream starting
! * position(i.e tables-only image) we should not try to access
! * imagePositions.size() as it done below because it will lead to
! * IndexOutOfBoundsException for imagePositions list.
! */
! if (seekForwardOnly && (!(imagePositions.isEmpty()))) {
Long pos = imagePositions.get(imagePositions.size()-1);
iis.flushBefore(pos.longValue());
}
tablesOnlyChecked = true;
}
*** 490,499 ****
--- 511,527 ----
throw new IndexOutOfBoundsException();
}
if (!tablesOnlyChecked) {
checkTablesOnly();
}
+ /*
+ * We should not try to read image information from an input stream
+ * which only contains tables-only(StreamMetadata) information.
+ */
+ if (tablesOnlyStream) {
+ throw new IIOException("No image data present to read");
+ }
if (imageIndex < imagePositions.size()) {
iis.seek(imagePositions.get(imageIndex).longValue());
} else {
// read to start of image, saving positions
// First seek to the last position we already have, and skip the
< prev index next >