From b0e6fbed9f6a7428e459826e1f3b7f5286bf53cc Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Thu, 2 Jan 2020 14:55:16 +0100 Subject: [PATCH] #510: Fixes possible hang situation (cherry picked from commit 5501c0e7094d094623648dc9355d9b620da7bef8) --- .../jpeg/JPEGSegmentImageInputStream.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java index d00c09d4..37b49462 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java @@ -37,7 +37,7 @@ import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageInputStreamImpl; import java.io.EOFException; import java.io.IOException; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -58,12 +58,12 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { // TODO: Rewrite JPEGSegment (from metadata) to store stream pos/length, and be able to replay data, and use instead of Segment? // TODO: Support multiple JPEG streams (SOI...EOI, SOI...EOI, ...) in a single file - final private ImageInputStream stream; - final private JPEGSegmentStreamWarningListener warningListener; + private final ImageInputStream stream; + private final JPEGSegmentStreamWarningListener warningListener; - final private ComponentIdSet componentIds = new ComponentIdSet(); + private final ComponentIdSet componentIds = new ComponentIdSet(); - private final List segments = new ArrayList(64); + private final List segments = new ArrayList<>(64); private int currentSegment = -1; private Segment segment; @@ -275,7 +275,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { processWarningOccured(String.format("Duplicate component ID %d in SOF", id)); id++; - while (!componentIds.add(id) && componentIds.size() <= 16) { + while (componentIds.size() < 4 && !componentIds.add(id) && id < 255) { id++; } @@ -330,7 +330,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { } static String asAsciiString(final byte[] data, final int offset, final int length) { - return new String(data, offset, length, Charset.forName("ascii")); + return new String(data, offset, length, StandardCharsets.US_ASCII); } private void streamInit() throws IOException { @@ -443,8 +443,9 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { } @SuppressWarnings({"FinalizeDoesntCallSuperFinalize"}) + @Deprecated @Override - protected void finalize() throws Throwable { + protected void finalize() { // Empty finalizer (for improved performance; no need to call super.finalize() in this case) } @@ -585,7 +586,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { } static final class ComponentIdSet { - final int[] values = new int[4]; // The native code don't support more than 4 components + final int[] values = new int[4]; // The native code doesn't support more than 4 components int size; boolean add(final int value) {