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);
+ }
+ }
}