Skip to content

Commit ed6d0c2

Browse files
committed
Additional bound checks in JvmZipReader
1 parent fbcf235 commit ed6d0c2

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/main/java/software/coley/lljzip/format/read/JvmZipReader.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,15 @@ else if (MemorySegmentUtil.readQuad(data, jvmBaseFileOffset) == ZipPatterns.CENT
193193

194194
// Add associated local file header offset
195195
long offset = jvmBaseFileOffset + directory.getRelativeOffsetOfLocalHeader();
196-
if (MemorySegmentUtil.readQuad(data, offset) == ZipPatterns.LOCAL_FILE_HEADER_QUAD) {
196+
if (offset >= 0 && offset < len - 4 && MemorySegmentUtil.readQuad(data, offset) == ZipPatterns.LOCAL_FILE_HEADER_QUAD) {
197197
entryOffsets.add(offset);
198198
}
199199
}
200+
200201
// Add the earliest central directory offset, which serves as the upper bound to search against for the
201202
// last local file header entry's file data contents.
202203
entryOffsets.add(earliestCdfh);
204+
203205
// Add the end of central directory
204206
entryOffsets.add(endOfCentralDirectoryOffset);
205207

@@ -214,18 +216,18 @@ else if (MemorySegmentUtil.readQuad(data, jvmBaseFileOffset) == ZipPatterns.CENT
214216
continue;
215217
}
216218

217-
if (MemorySegmentUtil.readQuad(data, offset) != ZipPatterns.LOCAL_FILE_HEADER_QUAD) {
219+
if (offset >= 0 && offset <= len - 4 && MemorySegmentUtil.readQuad(data, offset) != ZipPatterns.LOCAL_FILE_HEADER_QUAD) {
218220
logger.warn("Central-Directory-File-Header's offset[{}] to Local-File-Header does not match the Local-File-Header magic!", offset);
219221
continue;
220222
}
221223

222224
try {
223225
LocalFileHeader file = newLocalFileHeader();
224-
if (file instanceof JvmLocalFileHeader) {
225-
((JvmLocalFileHeader) file).setOffsets(entryOffsets);
226-
}
226+
if (file instanceof JvmLocalFileHeader jvmFile)
227+
jvmFile.setOffsets(entryOffsets);
227228
try {
228-
file.read(data, offset);
229+
if (offset <= len - LocalFileHeader.MIN_FIXED_SIZE)
230+
file.read(data, offset);
229231
} catch (IndexOutOfBoundsException t) {
230232
// Its intended that if this fails the adopting of CEN values below will work instead.
231233
}

0 commit comments

Comments
 (0)