You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2025/07/31 09:48:29 UTC

(sis) branch geoapi-4.0 updated: Fix a bug introduced 4 commits ago in the fix of Deflate compression of TIFF image.

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


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new e678bb2111 Fix a bug introduced 4 commits ago in the fix of Deflate compression of TIFF image.
e678bb2111 is described below

commit e678bb211180006aedbb8671976b2cb9ad83f8b5
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Thu Jul 31 11:46:35 2025 +0200

    Fix a bug introduced 4 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 {