open($path, \ZipArchive::RDONLY) !== true) { return 'archive_inspection_failed'; } try { $maxEntries = max(1, (int) config('services.malware.max_archive_entries', 1000)); $maxExpandedBytes = max(1, (int) config('services.malware.max_decompressed_bytes', 104857600)); if ($archive->numFiles > $maxEntries) { return 'archive_entry_limit_exceeded'; } $expandedBytes = 0; for ($index = 0; $index < $archive->numFiles; $index++) { $entry = $archive->statIndex($index); if (! is_array($entry) || $entry['size'] < 0) { return 'archive_inspection_failed'; } if ($entry['size'] > $maxExpandedBytes - $expandedBytes) { return 'archive_decompression_limit'; } $expandedBytes += $entry['size']; } return null; } finally { $archive->close(); } } }