Skip to content

Commit ae80120

Browse files
committed
Fix not handling JvmLocalFileHeader data population as lazy-read
1 parent d7b7b3f commit ae80120

File tree

4 files changed

+19
-5
lines changed

4 files changed

+19
-5
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>software.coley</groupId>
88
<artifactId>lljzip</artifactId>
9-
<version>1.5.0</version>
9+
<version>1.5.1</version>
1010

1111
<name>LL Java ZIP</name>
1212
<description>Lower level ZIP support for Java</description>

src/main/java/software/coley/llzip/format/model/AbstractZipFileHeader.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,4 +325,12 @@ protected LazyByteData readLongSlice(ByteData data, LazyInt localOffset, LazyLon
325325
return data.sliceOf(offset + localOffset.get(), length.get());
326326
});
327327
}
328+
329+
protected LazyByteData readLongSlice(ByteData data, LazyLong localOffset, LazyLong length) {
330+
return new LazyByteData(() -> {
331+
if (data.isClosed())
332+
throw new IllegalStateException("Cannot read from closed data source");
333+
return data.sliceOf(offset + localOffset.get(), length.get());
334+
});
335+
}
328336
}

src/main/java/software/coley/llzip/format/model/JvmLocalFileHeader.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import software.coley.llzip.format.compression.ZipCompressions;
44
import software.coley.llzip.util.ByteData;
5+
import software.coley.llzip.util.lazy.LazyInt;
6+
import software.coley.llzip.util.lazy.LazyLong;
57

68
import java.util.NavigableSet;
79

@@ -39,8 +41,10 @@ public void read(ByteData data, long offset) {
3941
this.dataOffsetStart = dataOffsetStart;
4042
this.dataOffsetEnd = dataOffsetEnd == null ? -1 : dataOffsetEnd;
4143
if (dataOffsetEnd != null) {
42-
// Valid data range found
43-
setFileData(data.slice(dataOffsetStart, dataOffsetEnd));
44+
// Valid data range found, map back to (localOffset, range)
45+
fileData = readLongSlice(data,
46+
new LazyLong(() -> dataOffsetStart - offset),
47+
new LazyLong(() -> dataOffsetEnd - offset));
4448
foundData = true;
4549
} else {
4650
// Keep data reference to attempt restoration with later when linking to the CEN.
@@ -78,7 +82,9 @@ public void link(CentralDirectoryFileHeader directoryFileHeader) {
7882
// Data should not be overflowing into adjacent header entries.
7983
// - If it is, the data here is likely intentionally tampered with to screw with parsers
8084
if (fileDataLength + offset < dataOffsetEnd) {
81-
setFileData(data.sliceOf(dataOffsetStart, fileDataLength));
85+
fileData = readLongSlice(data,
86+
new LazyLong(() -> dataOffsetStart - offset),
87+
new LazyLong(() -> fileDataLength));
8288
data = null;
8389
}
8490
}

src/main/java/software/coley/llzip/format/model/LocalFileHeader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class LocalFileHeader extends AbstractZipFileHeader {
4040
private transient CentralDirectoryFileHeader linkedDirectoryFileHeader;
4141

4242
// LocalFileHeader spec (plus common elements between this and central file)
43-
private LazyByteData fileData;
43+
protected LazyByteData fileData;
4444

4545
// Caches
4646
private transient LazyLong fileDataLength;

0 commit comments

Comments
 (0)