Skip to content

Commit 8ab737e

Browse files
committed
Unsigned handling of words and quads:
- Words of importance are automatically made unsigned, as they are integer fields. - Quads of importance are made unsigned when used as such as they are still integer fields.
1 parent 90fa061 commit 8ab737e

File tree

7 files changed

+42
-20
lines changed

7 files changed

+42
-20
lines changed

src/main/java/software/coley/llzip/part/CentralDirectoryFileHeader.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ public void read(ByteData data, long offset) {
5151
crc32 = ByteDataUtil.readQuad(data, offset + 16);
5252
compressedSize = ByteDataUtil.readQuad(data, offset + 20);
5353
uncompressedSize = ByteDataUtil.readQuad(data, offset + 24);
54-
fileNameLength = ByteDataUtil.readWord(data, offset + 28);
55-
extraFieldLength = ByteDataUtil.readWord(data, offset + 30);
56-
fileCommentLength = ByteDataUtil.readWord(data, offset + 32);
54+
setFileNameLength(ByteDataUtil.readWord(data, offset + 28));
55+
setExtraFieldLength(ByteDataUtil.readWord(data, offset + 30));
56+
setFileCommentLength(ByteDataUtil.readWord(data, offset + 32));
5757
diskNumberStart = ByteDataUtil.readWord(data, offset + 34);
5858
internalFileAttributes = ByteDataUtil.readWord(data, offset + 36);
5959
externalFileAttributes = ByteDataUtil.readQuad(data, offset + 38);
@@ -254,7 +254,7 @@ public int getFileNameLength() {
254254
* Length of {@link #getFileName()}.
255255
*/
256256
public void setFileNameLength(int fileNameLength) {
257-
this.fileNameLength = fileNameLength;
257+
this.fileNameLength = fileNameLength & 0xffff;
258258
}
259259

260260
/**
@@ -269,7 +269,7 @@ public int getExtraFieldLength() {
269269
* Length of {@link #getExtraField()}
270270
*/
271271
public void setExtraFieldLength(int extraFieldLength) {
272-
this.extraFieldLength = extraFieldLength;
272+
this.extraFieldLength = extraFieldLength & 0xffff;
273273
}
274274

275275
/**
@@ -284,7 +284,7 @@ public int getFileCommentLength() {
284284
* Length of {@link #getFileComment()}.
285285
*/
286286
public void setFileCommentLength(int fileCommentLength) {
287-
this.fileCommentLength = fileCommentLength;
287+
this.fileCommentLength = fileCommentLength & 0xffff;
288288
}
289289

290290
/**

src/main/java/software/coley/llzip/part/EndOfCentralDirectory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void read(ByteData data, long offset) {
3434
numEntries = ByteDataUtil.readWord(data, offset + 10);
3535
centralDirectorySize = ByteDataUtil.readQuad(data, offset + 12);
3636
centralDirectoryOffset = ByteDataUtil.readQuad(data, offset + 16);
37-
zipCommentLength = ByteDataUtil.readWord(data, offset + 20);
37+
setZipCommentLength(ByteDataUtil.readWord(data, offset + 20));
3838
zipComment = data.sliceOf(offset + 22, zipCommentLength);
3939
}
4040

@@ -157,7 +157,7 @@ public int getZipCommentLength() {
157157
* {@link #getZipComment() Comment} length.
158158
*/
159159
public void setZipCommentLength(int zipCommentLength) {
160-
this.zipCommentLength = zipCommentLength;
160+
this.zipCommentLength = zipCommentLength & 0xffff;
161161
}
162162

163163
/**

src/main/java/software/coley/llzip/part/JvmLocalFileHeader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ public void read(ByteData data, long offset) {
4747
public void link(CentralDirectoryFileHeader directoryFileHeader) {
4848
super.link(directoryFileHeader);
4949
if (!foundPk) {
50-
int fileDataLength;
50+
long fileDataLength;
5151
if (getCompressionMethod() == ZipCompressions.STORED) {
52-
fileDataLength = directoryFileHeader.getUncompressedSize();
52+
fileDataLength = directoryFileHeader.getUncompressedSize() & 0xffffffffL;
5353
} else {
54-
fileDataLength = directoryFileHeader.getCompressedSize();
54+
fileDataLength = directoryFileHeader.getCompressedSize() & 0xffffffffL;
5555
}
5656
setFileData(data.sliceOf(offset, fileDataLength));
5757
data = null;

src/main/java/software/coley/llzip/part/LocalFileHeader.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,16 @@ public void read(ByteData data, long offset) {
4646
crc32 = ByteDataUtil.readQuad(data, offset + 14);
4747
compressedSize = ByteDataUtil.readQuad(data, offset + 18);
4848
uncompressedSize = ByteDataUtil.readQuad(data, offset + 22);
49-
fileNameLength = ByteDataUtil.readWord(data, offset + 26);
50-
extraFieldLength = ByteDataUtil.readWord(data, offset + 28);
49+
// Reading these to ints so ensure they act as unsigned shorts
50+
setFileNameLength(ByteDataUtil.readWord(data, offset + 26));
51+
setExtraFieldLength(ByteDataUtil.readWord(data, offset + 28));
5152
fileName = data.sliceOf(offset + 30, fileNameLength);
5253
extraField = data.sliceOf(offset + 30 + fileNameLength, extraFieldLength);
53-
int fileDataLength;
54+
long fileDataLength;
5455
if (compressionMethod == STORED) {
55-
fileDataLength = uncompressedSize;
56+
fileDataLength = uncompressedSize & 0xffffffffL;
5657
} else {
57-
fileDataLength = compressedSize;
58+
fileDataLength = compressedSize & 0xffffffffL;
5859
}
5960
fileData = data.sliceOf(offset + 30 + fileNameLength + extraFieldLength, fileDataLength);
6061
}
@@ -241,7 +242,7 @@ public int getFileNameLength() {
241242
* Length of {@link #getFileName()}.
242243
*/
243244
public void setFileNameLength(int fileNameLength) {
244-
this.fileNameLength = fileNameLength;
245+
this.fileNameLength = fileNameLength & 0xffff;
245246
}
246247

247248
/**
@@ -256,7 +257,7 @@ public int getExtraFieldLength() {
256257
* Length of {@link #getExtraField()}
257258
*/
258259
public void setExtraFieldLength(int extraFieldLength) {
259-
this.extraFieldLength = extraFieldLength;
260+
this.extraFieldLength = extraFieldLength & 0xffff;
260261
}
261262

262263
/**

src/main/java/software/coley/llzip/strategy/DefaultZipReaderStrategy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ public void read(ZipArchive zip, ByteData data) throws IOException {
3535
zip.getParts().add(end);
3636
// Read central directories
3737
long len = data.length();
38-
int centralDirectoryOffset = end.getCentralDirectoryOffset();
38+
long centralDirectoryOffset = end.getCentralDirectoryOffset();
3939
while (centralDirectoryOffset < len && ByteDataUtil.startsWith(data, centralDirectoryOffset, ZipPatterns.CENTRAL_DIRECTORY_FILE_HEADER)) {
4040
CentralDirectoryFileHeader directory = new CentralDirectoryFileHeader();
4141
directory.read(data, centralDirectoryOffset);
42-
centralDirectoryOffset += directory.length();
42+
centralDirectoryOffset += directory.length() & 0xffffffffL; // FIXME: Could still be a lossy cast
4343
zip.getParts().add(directory);
4444
}
4545
// Read local files
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package software.coley.llzip;
2+
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.io.IOException;
7+
import java.nio.file.Paths;
8+
9+
/**
10+
* Tests that reading larger strings from zip files works correctly.
11+
*/
12+
public class LargeStringTests {
13+
@Test
14+
public void testLargeStrings() {
15+
try {
16+
ZipIO.readStandard(Paths.get("src/test/resources/large-strings.zip"));
17+
} catch (IOException error) {
18+
Assertions.fail(error);
19+
}
20+
}
21+
}
96.3 KB
Binary file not shown.

0 commit comments

Comments
 (0)