From 17ca80e19d35bb0cc69abad578cd361dd2e5c325 Mon Sep 17 00:00:00 2001 From: Vojtech Moravec <vojtech.moravec.st@vsb.cz> Date: Mon, 21 Sep 2020 16:01:31 +0200 Subject: [PATCH] Fix stream decompression. --- .../compression/ImageDecompressor.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/azgracompress/compression/ImageDecompressor.java b/src/main/java/azgracompress/compression/ImageDecompressor.java index e762149..b8ab49d 100644 --- a/src/main/java/azgracompress/compression/ImageDecompressor.java +++ b/src/main/java/azgracompress/compression/ImageDecompressor.java @@ -10,6 +10,7 @@ import azgracompress.utilities.Utils; import org.jetbrains.annotations.Nullable; import java.io.*; +import java.util.Arrays; import java.util.Optional; @@ -293,9 +294,12 @@ public class ImageDecompressor extends CompressorDecompressorBase { try (DataInputStream dis = new DataInputStream(new BufferedInputStream(compressedStream))) { assert (dis.markSupported()); - cachedHeader.setImageSizeX(dis.readUnsignedShort()); - cachedHeader.setImageSizeY(dis.readUnsignedShort()); - cachedHeader.setImageSizeZ(dis.readUnsignedShort()); + final QCMPFileHeader header = cachedHeader.copyOf(); + + header.setImageSizeX(dis.readUnsignedShort()); + header.setImageSizeY(dis.readUnsignedShort()); + header.setImageSizeZ(dis.readUnsignedShort()); + final int chunkCount = dis.readUnsignedShort(); final long[] chunkSizes = new long[chunkCount]; @@ -303,7 +307,7 @@ public class ImageDecompressor extends CompressorDecompressorBase { dis.mark(contentLength); { - int toSkip = contentLength - (4 * 2); + int toSkip = contentLength - ((4 * 2) + (chunkCount * 2)); while (toSkip > 0) { int skipped = dis.skipBytes(toSkip); assert (skipped > 0); @@ -311,16 +315,16 @@ public class ImageDecompressor extends CompressorDecompressorBase { } assert (toSkip == 0); for (int i = 0; i < chunkCount; i++) { - chunkSizes[i] = dis.readInt(); + chunkSizes[i] = dis.readUnsignedShort(); } } dis.reset(); - cachedHeader.setPlaneDataSizes(chunkSizes); + header.setPlaneDataSizes(chunkSizes); - return cachedDecompressor.decompressStreamMode(dis, cachedHeader); + return cachedDecompressor.decompressStreamMode(dis, header); } catch (IOException e) { throw new ImageDecompressionException("Unable to decompress chunk of image from stream.", e); } -- GitLab