Nico Kruber created COMPRESS-244: ------------------------------------ Summary: 7z reading of UINT64 data type is wrong for big values Key: COMPRESS-244 URL: https://issues.apache.org/jira/browse/COMPRESS-244 Project: Commons Compress Issue Type: Bug Components: Archivers Affects Versions: 1.6 Reporter: Nico Kruber
h2. Brief description large values with a first byte indicating at least 4 additional bytes shift an integer by at least 32bits thus leading to an overflow and an incorrect value - the value needs to be casted to long before the bitshift! h2. Patch let me see whether I can attach the patch as a file, otherwise this is it, inline: {noformat} diff -U 3 -H -d -r -N -x .git -x .svn -- commons-compress-1.6-src.orig/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java commons-compress-1.6-src/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java --- commons-compress-1.6-src.orig/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java 2013-11-25 12:32:22.051085223 +0100 +++ commons-compress-1.6-src/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java 2013-10-23 05:59:56.000000000 +0200 @@ -900,7 +900,7 @@ long value = 0; for (int i = 0; i < 8; i++) { if ((firstByte & mask) == 0) { - return value | ((firstByte & (mask - 1)) << (8 * i)); + return value | (((long) (firstByte & (mask - 1))) << (8 * i)); } long nextByte = in.readUnsignedByte(); value |= (nextByte << (8 * i)); {noformat} h2. Details from the 7z documentation {quote} {noformat} UINT64 means real UINT64 encoded with the following scheme: Size of encoding sequence depends from first byte: First_Byte Extra_Bytes Value (binary) 0xxxxxxx : ( xxxxxxx ) 10xxxxxx BYTE y[1] : ( xxxxxx << (8 * 1)) + y 110xxxxx BYTE y[2] : ( xxxxx << (8 * 2)) + y ... 1111110x BYTE y[6] : ( x << (8 * 6)) + y 11111110 BYTE y[7] : y 11111111 BYTE y[8] : y {noformat} {quote} -- This message was sent by Atlassian JIRA (v6.1#6144)