This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git


The following commit(s) were added to refs/heads/master by this push:
     new 403ac6d46 Fixed write so it no longer throws an 
IndexOutOfBoundsException when data is larger than Block size. Test was added. 
(#436)
403ac6d46 is described below

commit 403ac6d46e59687acd6a21dbf62c00ce805e3224
Author: cpreisler <[email protected]>
AuthorDate: Thu Nov 9 14:12:27 2023 -0600

    Fixed write so it no longer throws an IndexOutOfBoundsException when data 
is larger than Block size. Test was added. (#436)
    
    Co-authored-by: Chad Preisler 
<[email protected]>
---
 .../lz4/FramedLZ4CompressorOutputStream.java       | 23 +++++++---------------
 .../lz4/FramedLZ4CompressorRoundtripTest.java      | 18 +++++++++++++++++
 2 files changed, 25 insertions(+), 16 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorOutputStream.java
 
b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorOutputStream.java
index 3f8f00589..612b0a50a 100644
--- 
a/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorOutputStream.java
+++ 
b/src/main/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorOutputStream.java
@@ -158,7 +158,6 @@ public class FramedLZ4CompressorOutputStream extends 
CompressorOutputStream {
     private final Parameters params;
 
     private boolean finished;
-    private int currentIndex;
 
     // used for frame header checksum and content checksum, if requested
     private final XXHash32 contentHash = new XXHash32();
@@ -230,15 +229,12 @@ public class FramedLZ4CompressorOutputStream extends 
CompressorOutputStream {
      */
     public void finish() throws IOException {
         if (!finished) {
-            if (currentIndex > 0) {
-                flushBlock();
-            }
             writeTrailer();
             finished = true;
         }
     }
 
-    private void flushBlock() throws IOException {
+    private void flushBlock(int currentIndex) throws IOException {
         final boolean withBlockDependency = params.withBlockDependency;
         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
         try (BlockLZ4CompressorOutputStream o = new 
BlockLZ4CompressorOutputStream(baos, params.lz77params)) {
@@ -279,18 +275,13 @@ public class FramedLZ4CompressorOutputStream extends 
CompressorOutputStream {
             contentHash.update(data, off, len);
         }
         final int blockDataLength = blockData.length;
-        if (currentIndex + len > blockDataLength) {
-            flushBlock();
-            while (len > blockDataLength) {
-                System.arraycopy(data, off, blockData, 0, blockDataLength);
-                off += blockDataLength;
-                len -= blockDataLength;
-                currentIndex = blockDataLength;
-                flushBlock();
-            }
+        while (len > 0) {
+            int copyLen = Math.min(len, blockDataLength);
+            System.arraycopy(data, off, blockData, 0, copyLen);
+            off += blockDataLength;
+            len -= copyLen;
+            flushBlock(copyLen);
         }
-        System.arraycopy(data, off, blockData, currentIndex, len);
-        currentIndex += len;
     }
 
     @Override
diff --git 
a/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorRoundtripTest.java
 
b/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorRoundtripTest.java
index cb31a304e..2cee5d433 100644
--- 
a/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorRoundtripTest.java
+++ 
b/src/test/java/org/apache/commons/compress/compressors/lz4/FramedLZ4CompressorRoundtripTest.java
@@ -26,10 +26,12 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Files;
+import java.util.Random;
 import java.util.stream.Stream;
 
 import org.apache.commons.compress.AbstractTest;
 import org.apache.commons.compress.utils.IOUtils;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -100,4 +102,20 @@ public final class FramedLZ4CompressorRoundtripTest 
extends AbstractTest {
         // System.err.println(outputSz.getName() + " read after " + 
(System.currentTimeMillis() - start) + "ms");
     }
 
+    @Test
+    public void test64KMultipleBlocks() throws IOException {
+        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+        int count = 0;
+        byte[] expected = new byte[98304];
+        new Random(0).nextBytes(expected);
+        try (FramedLZ4CompressorOutputStream compressor = 
+                new FramedLZ4CompressorOutputStream(buffer, 
+                        new 
FramedLZ4CompressorOutputStream.Parameters(FramedLZ4CompressorOutputStream.BlockSize.K64,
 true, false, false))) {
+            compressor.write(expected);
+        }
+        try (FramedLZ4CompressorInputStream sis = new 
FramedLZ4CompressorInputStream(new ByteArrayInputStream(buffer.toByteArray()))) 
{
+            final byte[] actual = IOUtils.toByteArray(sis);
+            assertArrayEquals(expected, actual);
+        }
+    }
 }

Reply via email to