@@ -193,13 +193,15 @@ else if (MemorySegmentUtil.readQuad(data, jvmBaseFileOffset) == ZipPatterns.CENT
193
193
194
194
// Add associated local file header offset
195
195
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 ) {
197
197
entryOffsets .add (offset );
198
198
}
199
199
}
200
+
200
201
// Add the earliest central directory offset, which serves as the upper bound to search against for the
201
202
// last local file header entry's file data contents.
202
203
entryOffsets .add (earliestCdfh );
204
+
203
205
// Add the end of central directory
204
206
entryOffsets .add (endOfCentralDirectoryOffset );
205
207
@@ -214,18 +216,18 @@ else if (MemorySegmentUtil.readQuad(data, jvmBaseFileOffset) == ZipPatterns.CENT
214
216
continue ;
215
217
}
216
218
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 ) {
218
220
logger .warn ("Central-Directory-File-Header's offset[{}] to Local-File-Header does not match the Local-File-Header magic!" , offset );
219
221
continue ;
220
222
}
221
223
222
224
try {
223
225
LocalFileHeader file = newLocalFileHeader ();
224
- if (file instanceof JvmLocalFileHeader ) {
225
- ((JvmLocalFileHeader ) file ).setOffsets (entryOffsets );
226
- }
226
+ if (file instanceof JvmLocalFileHeader jvmFile )
227
+ jvmFile .setOffsets (entryOffsets );
227
228
try {
228
- file .read (data , offset );
229
+ if (offset <= len - LocalFileHeader .MIN_FIXED_SIZE )
230
+ file .read (data , offset );
229
231
} catch (IndexOutOfBoundsException t ) {
230
232
// Its intended that if this fails the adopting of CEN values below will work instead.
231
233
}
0 commit comments