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 2018/01/05 09:47:23 UTC
[2/2] commons-compress git commit: COMPRESS-380 ensure end if stream
is detected properly
COMPRESS-380 ensure end if stream is detected properly
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/b97a02ca
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/b97a02ca
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/b97a02ca
Branch: refs/heads/COMPRESS-380
Commit: b97a02ca1c1c220f18971bce3dc41d781da8f5f0
Parents: 0e74bef
Author: Stefan Bodewig <bo...@apache.org>
Authored: Fri Jan 5 10:45:47 2018 +0100
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Fri Jan 5 10:45:47 2018 +0100
----------------------------------------------------------------------
.../compressors/deflate64/HuffmanDecoder.java | 45 +++++++++++++-------
1 file changed, 29 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-compress/blob/b97a02ca/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java b/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
index ec4a6f0..e96959c 100644
--- a/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
+++ b/src/main/java/org/apache/commons/compress/compressors/deflate64/HuffmanDecoder.java
@@ -20,6 +20,7 @@ package org.apache.commons.compress.compressors.deflate64;
import org.apache.commons.compress.utils.BitInputStream;
import java.io.Closeable;
+import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteOrder;
@@ -130,13 +131,13 @@ class HuffmanDecoder implements Closeable {
while (!finalBlock || state.hasData()) {
switch (state.state()) {
case INITIAL:
- finalBlock = reader.readBits(1) == 1;
- int mode = (int) reader.readBits(2);
+ finalBlock = readBits(1) == 1;
+ int mode = (int) readBits(2);
switch (mode) {
case 0:
- reader.readBits(Byte.SIZE - 3);
- long bLen = reader.readBits(16);
- long bNLen = reader.readBits(16);
+ readBits(Byte.SIZE - 3);
+ long bLen = readBits(16);
+ long bNLen = readBits(16);
if (((bLen ^ 0xFFFF) & 0xFFFF) != bNLen) {
//noinspection DuplicateStringLiteralInspection
throw new IllegalStateException("Illegal LEN / NLEN values");
@@ -147,10 +148,10 @@ class HuffmanDecoder implements Closeable {
state = new HuffmanCodes(FIXED_CODES, FIXED_LITERALS, FIXED_DISTANCE);
break;
case 2:
- int literals = (int) (reader.readBits(5) + 257);
+ int literals = (int) (readBits(5) + 257);
int[] literalTable = new int[literals];
- int distances = (int) (reader.readBits(5) + 1);
+ int distances = (int) (readBits(5) + 1);
int[] distanceTable = new int[distances];
populateDynamicTables(reader, literalTable, distanceTable);
@@ -199,7 +200,7 @@ class HuffmanDecoder implements Closeable {
int read(byte[] b, int off, int len) throws IOException {
int max = Math.min(blockLength - read, len);
for (int i = 0; i < max; i++) {
- byte next = (byte) (reader.readBits(Byte.SIZE) & 0xFF);
+ byte next = (byte) (readBits(Byte.SIZE) & 0xFF);
b[off + i] = memory.add(next);
read++;
}
@@ -278,14 +279,14 @@ class HuffmanDecoder implements Closeable {
int runMask = RUN_LENGTH_TABLE[symbol - 257];
int run = runMask >>> 5;
int runXtra = runMask & 0x1F;
- run += reader.readBits(runXtra);
+ run += readBits(runXtra);
int distSym = nextSymbol(reader, distanceTree);
int distMask = DISTANCE_TABLE[distSym];
int dist = distMask >>> 4;
int distXtra = distMask & 0xF;
- dist += reader.readBits(distXtra);
+ dist += readBits(distXtra);
runBuffer = new byte[run];
runBufferPos = 0;
@@ -326,18 +327,18 @@ class HuffmanDecoder implements Closeable {
private static int nextSymbol(BitInputStream reader, BinaryTreeNode tree) throws IOException {
BinaryTreeNode node = tree;
while (node != null && node.literal == -1) {
- long bit = reader.readBits(1);
+ long bit = readBits(reader, 1);
node = bit == 0 ? node.left : node.right;
}
return node != null ? node.literal : -1;
}
private static void populateDynamicTables(BitInputStream reader, int[] literals, int[] distances) throws IOException {
- int codeLengths = (int) (reader.readBits(4) + 4);
+ int codeLengths = (int) (readBits(reader, 4) + 4);
int[] codeLengthValues = new int[19];
for (int cLen = 0; cLen < codeLengths; cLen++) {
- codeLengthValues[CODE_LENGTHS_ORDER[cLen]] = (int) reader.readBits(3);
+ codeLengthValues[CODE_LENGTHS_ORDER[cLen]] = (int) readBits(reader, 3);
}
BinaryTreeNode codeLengthTree = buildTree(codeLengthValues);
@@ -355,13 +356,13 @@ class HuffmanDecoder implements Closeable {
value = symbol;
auxBuffer[i++] = value;
} else if (symbol == 16) {
- length = (int) (reader.readBits(2) + 3);
+ length = (int) (readBits(reader, 2) + 3);
} else if (symbol == 17) {
value = 0;
- length = (int) (reader.readBits(3) + 3);
+ length = (int) (readBits(reader, 3) + 3);
} else if (symbol == 18) {
value = 0;
- length = (int) (reader.readBits(7) + 11);
+ length = (int) (readBits(reader, 7) + 11);
}
}
}
@@ -479,4 +480,16 @@ class HuffmanDecoder implements Closeable {
return (counter + 1) & mask;
}
}
+
+ private long readBits(int numBits) throws IOException {
+ return readBits(reader, numBits);
+ }
+
+ private static long readBits(BitInputStream reader, int numBits) throws IOException {
+ long r = reader.readBits(numBits);
+ if (r == -1) {
+ throw new EOFException();
+ }
+ return r;
+ }
}