Skip to content

Commit 1587028

Browse files
authored
Correctly raise on bad filter (#4241)
1 parent a27b024 commit 1587028

File tree

4 files changed

+22
-12
lines changed

4 files changed

+22
-12
lines changed

scapy/arch/bpf/supersocket.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ def __init__(self,
214214
try:
215215
attach_filter(self.bpf_fd, filter, self.iface)
216216
filter_attached = True
217-
except ImportError as ex:
218-
warning("Cannot set filter: %s" % ex)
217+
except (ImportError, Scapy_Exception) as ex:
218+
raise Scapy_Exception("Cannot set filter: %s" % ex)
219219
if NETBSD and filter_attached is False:
220220
# On NetBSD, a filter must be attached to an interface, otherwise
221221
# no frame will be received by os.read(). When no filter has been

scapy/arch/libpcap.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ def close(self):
162162
pcap_datalink,
163163
pcap_findalldevs,
164164
pcap_freealldevs,
165+
pcap_geterr,
165166
pcap_if_t,
166167
pcap_lib_version,
167168
pcap_next_ex,
@@ -386,16 +387,16 @@ def fileno(self):
386387
return cast(int, pcap_get_selectable_fd(self.pcap))
387388

388389
def setfilter(self, f):
389-
# type: (str) -> bool
390+
# type: (str) -> None
390391
filter_exp = create_string_buffer(f.encode("utf8"))
391-
if pcap_compile(self.pcap, byref(self.bpf_program), filter_exp, 1, -1) == -1: # noqa: E501
392-
log_runtime.error("Could not compile filter expression %s", f)
393-
return False
394-
else:
395-
if pcap_setfilter(self.pcap, byref(self.bpf_program)) == -1:
396-
log_runtime.error("Could not set filter %s", f)
397-
return False
398-
return True
392+
if pcap_compile(self.pcap, byref(self.bpf_program), filter_exp, 1, -1) >= 0: # noqa: E501
393+
if pcap_setfilter(self.pcap, byref(self.bpf_program)) >= 0:
394+
# Success
395+
return
396+
errstr = decode_locale_str(
397+
bytearray(pcap_geterr(self.pcap)).strip(b"\x00")
398+
)
399+
raise Scapy_Exception("Cannot set filter: %s" % errstr)
399400

400401
def setnonblock(self, i):
401402
# type: (bool) -> None

scapy/arch/linux.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ def __init__(self,
507507
try:
508508
attach_filter(self.ins, filter, self.iface)
509509
except (ImportError, Scapy_Exception) as ex:
510-
log_runtime.error("Cannot set filter: %s", ex)
510+
raise Scapy_Exception("Cannot set filter: %s" % ex)
511511
if self.promisc:
512512
set_promisc(self.ins, self.iface)
513513
self.ins.bind((self.iface, type))

test/regression.uts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2262,6 +2262,15 @@ except Scapy_Exception:
22622262
else:
22632263
assert False
22642264

2265+
= Check online sniff() with a bad filter
2266+
~ needs_root tcpdump libpcap
2267+
try:
2268+
sniff(timeout=0, filter="bad filter")
2269+
except Scapy_Exception:
2270+
pass
2271+
else:
2272+
assert False
2273+
22652274
= Check offline sniff with lfilter
22662275
assert len(sniff(offline=[IP()/UDP(), IP()/TCP()], lfilter=lambda x: TCP in x)) == 1
22672276

0 commit comments

Comments
 (0)