This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 56fb08e575263571506ee4dc713e21b5e09b7776 Author: Martin Desruisseaux <[email protected]> AuthorDate: Thu Jul 31 11:46:35 2025 +0200 Fix a bug introduced 5 commits ago in the fix of Deflate compression of TIFF image. --- .../org/apache/sis/storage/geotiff/writer/ZIP.java | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/writer/ZIP.java b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/writer/ZIP.java index 2befb2f272..a9afb2f5b6 100644 --- a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/writer/ZIP.java +++ b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/writer/ZIP.java @@ -19,6 +19,7 @@ package org.apache.sis.storage.geotiff.writer; import java.io.IOException; import java.nio.ByteBuffer; import java.util.zip.Deflater; +import java.util.zip.ZipException; import org.apache.sis.io.stream.ChannelDataOutput; import org.apache.sis.storage.geotiff.base.Resources; @@ -77,10 +78,14 @@ final class ZIP extends CompressionChannel { */ final long numBytes = deflater.getBytesRead() + remaining; if (numBytes >= length) { - /* - * To be strict, we shoud raise an exception if `deflater.finished()` is true. - * But it is safer to do this check indirectly in the following loop instead. - */ + if (deflater.finished()) { + /* + * May happen if there is an inconsistency in the computation using pixel + * stride and scanline stride, sometime because of malformed sample model. + */ + throw new IOException(Resources.forLocale(null) + .getString(Resources.Keys.UnexpectedTileLength_2, length, numBytes)); + } deflater.finish(); } while (remaining > 0) { @@ -88,16 +93,13 @@ final class ZIP extends CompressionChannel { output.ensureBufferAccepts(Math.min(remaining, target.capacity())); target.limit(target.capacity()); // Allow the use of all available space. try { - if (deflater.deflate(target) == 0) { + if (deflater.deflate(target) == 0 && source.hasRemaining()) { /* * According Javadoc, it may occur if `deflater.needsInput()` needs to be checked. * But we already know that its value should be `false`. The other possibility is - * that `deflater.finished()` is true. The latter may happen if we determined that - * a call to this `write(…)` should be the last one, but this method is nevertheless - * invoked again. It may happen when there is inconsistency in the computation using - * pixel stride and scanline stride, sometime because of malformed sample model. + * that `deflater.finished()` is true but the deflater did not write all bytes. */ - throw new IOException(Resources.forLocale(null) + throw new ZipException(Resources.forLocale(null) .getString(Resources.Keys.UnexpectedTileLength_2, length, numBytes)); } } finally {
