@@ -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