Skip to content

Commit 016aa43

Browse files
authored
Merge pull request #6 from xxDark/master
2 parents e77320d + 8e02104 commit 016aa43

File tree

4 files changed

+37
-17
lines changed

4 files changed

+37
-17
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.1.2</version>
9+
<version>1.1.3</version>
1010

1111
<properties>
1212
<junit.version>5.8.2</junit.version>

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

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package software.coley.llzip.part;
22

3+
import software.coley.llzip.ZipCompressions;
34
import software.coley.llzip.util.ByteData;
45

56
import java.util.NavigableSet;
@@ -14,6 +15,9 @@
1415
*/
1516
public class JvmLocalFileHeader extends LocalFileHeader {
1617
private final NavigableSet<Long> offsets;
18+
private long offset;
19+
private boolean foundPk;
20+
private ByteData data;
1721

1822
/**
1923
* @param offsets
@@ -27,12 +31,30 @@ public JvmLocalFileHeader(NavigableSet<Long> offsets) {
2731
public void read(ByteData data, long offset) {
2832
super.read(data, offset);
2933
// JVM file data reading does NOT use the compressed/uncompressed fields.
30-
// Instead, it scans data until the next header/EOF.
34+
// Instead, it scans data until the next header.
3135
offset += MIN_FIXED_SIZE + getFileNameLength() + getExtraFieldLength();
36+
this.offset = offset;
3237
Long nextOffset = offsets.ceiling(offset);
33-
if (nextOffset != null)
38+
if (nextOffset != null) {
3439
setFileData(data.slice(offset, nextOffset));
35-
else
36-
setFileData(data.slice(offset, data.length()));
40+
foundPk = true;
41+
} else {
42+
this.data = data;
43+
}
44+
}
45+
46+
@Override
47+
public void link(CentralDirectoryFileHeader directoryFileHeader) {
48+
super.link(directoryFileHeader);
49+
if (!foundPk) {
50+
int fileDataLength;
51+
if (getCompressionMethod() == ZipCompressions.STORED) {
52+
fileDataLength = directoryFileHeader.getUncompressedSize();
53+
} else {
54+
fileDataLength = directoryFileHeader.getCompressedSize();
55+
}
56+
setFileData(data.sliceOf(offset, fileDataLength));
57+
data = null;
58+
}
3759
}
3860
}

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,27 +28,22 @@ public ByteData decompress(LocalFileHeader header, ByteData bytes) throws IOExce
2828
byte[] buffer = new byte[1024];
2929
long position = 0L;
3030
long length = bytes.length();
31-
boolean eof;
3231
do {
33-
eof = false;
3432
if (inflater.needsInput()) {
3533
int remaining = (int) Math.min(buffer.length, length);
3634
if (remaining == 0) {
37-
buffer[0] = 0;
38-
inflater.setInput(buffer, 0, 1);
39-
eof = true;
40-
} else {
41-
bytes.get(position, buffer, 0, remaining);
42-
length -= remaining;
43-
position += remaining;
44-
inflater.setInput(buffer, 0, remaining);
35+
break;
4536
}
37+
bytes.get(position, buffer, 0, remaining);
38+
length -= remaining;
39+
position += remaining;
40+
inflater.setInput(buffer, 0, remaining);
4641
}
4742
int count = inflater.inflate(output);
4843
if (count != 0) {
4944
out.write(output, 0, count);
5045
}
51-
} while (!eof && !inflater.finished() && !inflater.needsDictionary());
46+
} while (!inflater.finished() && !inflater.needsDictionary());
5247
}catch (DataFormatException e) {
5348
String s = e.getMessage();
5449
throw (ZipException) new ZipException(s != null ? null : "Invalid ZLIB data format").initCause(e);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ else if (ByteDataUtil.startsWith(data, jvmBaseOffset, ZipPatterns.CENTRAL_DIRECT
8585
Set<Long> offsets = new HashSet<>();
8686
TreeSet<Long> lfhOffsets = new TreeSet<>();
8787
for (CentralDirectoryFileHeader directory : zip.getCentralDirectories()) {
88-
lfhOffsets.add(jvmBaseOffset + directory.getRelativeOffsetOfLocalHeader());
88+
long offset = jvmBaseOffset + directory.getRelativeOffsetOfLocalHeader();
89+
if (ByteDataUtil.startsWith(data, offset, ZipPatterns.LOCAL_FILE_HEADER)) {
90+
lfhOffsets.add(offset);
91+
}
8992
}
9093
for (CentralDirectoryFileHeader directory : zip.getCentralDirectories()) {
9194
long offset = jvmBaseOffset + directory.getRelativeOffsetOfLocalHeader();

0 commit comments

Comments
 (0)