You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2017/04/06 13:18:32 UTC
[3/3] commons-compress git commit: fix calculation of self-copy
boundaries when expanding back-references
fix calculation of self-copy boundaries when expanding back-references
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/5ce60be9
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/5ce60be9
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/5ce60be9
Branch: refs/heads/master
Commit: 5ce60be9d55c62b72262680249ad933850aaa064
Parents: 62202d2
Author: Stefan Bodewig <bo...@apache.org>
Authored: Thu Apr 6 15:18:00 2017 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Thu Apr 6 15:18:00 2017 +0200
----------------------------------------------------------------------
.../lz4/BlockLZ4CompressorOutputStream.java | 4 ++--
.../lz4/BlockLZ4CompressorOutputStreamTest.java | 23 ++++++++++++++++++++
2 files changed, 25 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/5ce60be9/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStream.java b/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStream.java
index dfce36e..71ca713 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStream.java
@@ -264,9 +264,9 @@ public class BlockLZ4CompressorOutputStream extends CompressorOutputStream {
copyOffset = blockOffset + block.length - offsetRemaining;
copyLen = Math.min(lengthRemaining, block.length - copyOffset);
} else {
- // offsetRemaining is negative and points into the expanded bytes
+ // offsetRemaining is negative or 0 and points into the expanded bytes
block = expanded;
- copyOffset = writeOffset + offsetRemaining;
+ copyOffset = -offsetRemaining;
copyLen = Math.min(lengthRemaining, writeOffset + offsetRemaining);
}
System.arraycopy(block, copyOffset, expanded, writeOffset, copyLen);
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/5ce60be9/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStreamTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStreamTest.java b/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStreamTest.java
index 45bf684..fca3f88 100644
--- a/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStreamTest.java
+++ b/src/test/java/org/apache/commons/compress/compressors/lz4/BlockLZ4CompressorOutputStreamTest.java
@@ -319,6 +319,29 @@ public class BlockLZ4CompressorOutputStreamTest {
Assert.assertArrayEquals(expected, compressed);
}
+ @Test
+ public void rewritingWithFinalBackreferenceAndOffsetBiggerThan1() throws IOException {
+ // this caused trouble when expandFromList() fell into the "offsetRemaining is negative" self-copy case as the
+ // calculation of copyOffset was wrong
+ byte[] toCompress = prepareExpected(25);
+ for (int i = 0; i < toCompress.length; i += 4) {
+ toCompress[i] = 1;
+ }
+ // LZ77Compressor creates a four byte literal and a back-reference with offset 4 and length 21
+ // we'll need to split the back-reference and chop off the last 12 bytes
+ byte[] compressed = compress(toCompress);
+ byte[] expected = prepareExpected(1 + 4 + 2 + 1 + 12);
+ expected[0] = (byte) ((4<<4) | 5);
+ expected[1] = 1;
+ expected[5] = 4;
+ expected[6] = 0;
+ expected[7] = (byte) (12<<4);
+ for (int i = 11; i < expected.length; i += 4) {
+ expected[i] = 1;
+ }
+ Assert.assertArrayEquals(expected, compressed);
+ }
+
private byte[] compress(int length) throws IOException {
return compress(length, 0);
}