From 24070b6a9bbde0d189ca4b85a63ee12fd284bb41 Mon Sep 17 00:00:00 2001 From: Guillaume Valadon Date: Thu, 10 Sep 2026 11:46:17 +0200 Subject: [PATCH] Handle malformed gzip pcaps AI-Assisted: yes [pi] --- scapy/utils.py | 19 +++++++++++++++---- test/regression.uts | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/scapy/utils.py b/scapy/utils.py index 2e0e0479075..cc092a8cb09 100644 --- a/scapy/utils.py +++ b/scapy/utils.py @@ -36,6 +36,7 @@ import time import traceback import warnings +import zlib from scapy.config import conf from scapy.consts import DARWIN, OPENBSD, WINDOWS @@ -1387,7 +1388,7 @@ def open(fname # type: Union[IO[bytes], str] fdesc = open(filename, "rb") # type: _ByteStream magic = fdesc.peek(2)[:2] # type: ignore[union-attr] # BufferedReader if magic != b"\x1f\x8b": - magic = fdesc.read(2) + magic = fdesc.read(4) else: fdesc = fname filename = getattr(fdesc, "name", "No name") @@ -1396,9 +1397,19 @@ def open(fname # type: Union[IO[bytes], str] # GZIP header detected. if not isinstance(fname, str): fdesc.seek(0) - fdesc = gzip.GzipFile(fileobj=fdesc) - magic = fdesc.read(2) - magic += fdesc.read(2) + raw_fdesc = fdesc + fdesc = gzip.GzipFile(fileobj=raw_fdesc) + try: + magic = fdesc.read(4) + except (EOFError, OSError, zlib.error) as err: + fdesc.close() + if isinstance(fname, str): + raw_fdesc.close() + raise Scapy_Exception( + "Not a supported capture file (invalid gzip file)" + ) from err + else: + magic += fdesc.read(4 - len(magic)) return filename, fdesc, magic diff --git a/test/regression.uts b/test/regression.uts index c1e673c4510..31345596f05 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -2480,6 +2480,20 @@ except Scapy_Exception: file = BytesIO(b"\n\r\r\n\x00\x00\x008\x1a+