Skip to content

Commit d9d76f6

Browse files
committed
Catch invalid filter in tcpdump() & PcapReader warn
1 parent 880756c commit d9d76f6

3 files changed

Lines changed: 26 additions & 5 deletions

File tree

scapy/sendrecv.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -855,12 +855,12 @@ def _run(self,
855855
all(isinstance(elt, str) for elt in offline):
856856
sniff_sockets.update((PcapReader(
857857
fname if flt is None else
858-
tcpdump(fname, args=["-w", "-", flt], getfd=True)
858+
tcpdump(fname, args=["-w", "-"], flt=flt, getfd=True)
859859
), fname) for fname in offline)
860860
elif isinstance(offline, dict):
861861
sniff_sockets.update((PcapReader(
862862
fname if flt is None else
863-
tcpdump(fname, args=["-w", "-", flt], getfd=True)
863+
tcpdump(fname, args=["-w", "-"], flt=flt, getfd=True)
864864
), label) for fname, label in six.iteritems(offline))
865865
else:
866866
# Write Scapy Packet objects to a pcap file
@@ -878,7 +878,8 @@ def _write_to_pcap(packets_list):
878878
sniff_sockets[PcapReader(
879879
offline if flt is None else
880880
tcpdump(offline,
881-
args=["-w", "-", flt],
881+
args=["-w", "-"],
882+
flt=flt,
882883
getfd=True,
883884
quiet=quiet)
884885
)] = offline

scapy/utils.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,10 @@ def __call__(cls, filename):
971971
"""
972972
i = cls.__new__(cls, cls.__name__, cls.__bases__, cls.__dict__)
973973
filename, fdesc, magic = cls.open(filename)
974+
if not magic:
975+
raise Scapy_Exception(
976+
"No data could be read!"
977+
)
974978
try:
975979
i.__init__(filename, fdesc, magic)
976980
except Scapy_Exception:
@@ -1626,7 +1630,7 @@ def _guess_linktype_value(name):
16261630

16271631

16281632
@conf.commands.register
1629-
def tcpdump(pktlist=None, dump=False, getfd=False, args=None,
1633+
def tcpdump(pktlist=None, dump=False, getfd=False, args=None, flt=None,
16301634
prog=None, getproc=False, quiet=False, use_tempfile=None,
16311635
read_stdin_opts=None, linktype=None, wait=True,
16321636
_suppress=False):
@@ -1654,7 +1658,7 @@ def tcpdump(pktlist=None, dump=False, getfd=False, args=None,
16541658
Packet instances. Can also be a filename (as a string), an open
16551659
file-like object that must be a file format readable by
16561660
tshark (Pcap, PcapNg, etc.) or None (to sniff)
1657-
1661+
:param flt: a filter to use with tcpdump
16581662
:param dump: when set to True, returns a string instead of displaying it.
16591663
:param getfd: when set to True, returns a file-like object to read data
16601664
from tcpdump or tshark from.
@@ -1756,6 +1760,12 @@ def tcpdump(pktlist=None, dump=False, getfd=False, args=None,
17561760
# Make a copy of args
17571761
args = list(args)
17581762

1763+
if flt is not None:
1764+
# Check the validity of the filter
1765+
from scapy.arch.common import compile_filter
1766+
compile_filter(flt)
1767+
args.append(flt)
1768+
17591769
stdout = subprocess.PIPE if dump or getfd else None
17601770
stderr = open(os.devnull) if quiet else None
17611771
proc = None

test/regression.uts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7180,6 +7180,16 @@ assert(all(UDP in p for p in l))
71807180
l = sniff(offline=IP()/UDP(sport=(10000, 10001)), filter="tcp")
71817181
assert len(l) == 0
71827182

7183+
= Check offline sniff() with Packets, tcpdump and a bad filter
7184+
~ tcpdump
7185+
7186+
try:
7187+
sniff(offline=IP()/UDP(), filter="bad filter")
7188+
except Scapy_Exception:
7189+
pass
7190+
else:
7191+
assert False
7192+
71837193
= Check offline sniff with lfilter
71847194
assert len(sniff(offline=[IP()/UDP(), IP()/TCP()], lfilter=lambda x: TCP in x)) == 1
71857195

0 commit comments

Comments
 (0)