From 5d3289bc31c44b5dc4ec184825d013981f41bf21 Mon Sep 17 00:00:00 2001 From: Nils Weiss Date: Fri, 13 Oct 2023 10:24:27 +0200 Subject: [PATCH] Improve exception handling in PeriodicSender Thread --- scapy/utils.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scapy/utils.py b/scapy/utils.py index 211378cc9eb..129be1d32a9 100644 --- a/scapy/utils.py +++ b/scapy/utils.py @@ -3170,8 +3170,8 @@ def whois(ip_address): class PeriodicSenderThread(threading.Thread): - def __init__(self, sock, pkt, interval=0.5): - # type: (Any, _PacketIterable, float) -> None + def __init__(self, sock, pkt, interval=0.5, ignore_exceptions=True): + # type: (Any, _PacketIterable, float, bool) -> None """ Thread to send packets periodically Args: @@ -3186,13 +3186,20 @@ def __init__(self, sock, pkt, interval=0.5): self._socket = sock self._stopped = threading.Event() self._interval = interval + self._ignore_exceptions = ignore_exceptions threading.Thread.__init__(self) def run(self): # type: () -> None while not self._stopped.is_set() and not self._socket.closed: for p in self._pkts: - self._socket.send(p) + try: + self._socket.send(p) + except (OSError, TimeoutError) as e: + if self._ignore_exceptions: + return + else: + raise e self._stopped.wait(timeout=self._interval) if self._stopped.is_set() or self._socket.closed: break