From 6c7a893d13823764bad039ca1b29042c846ca311 Mon Sep 17 00:00:00 2001
From: Pierre LALET <pierre.lalet@cea.fr>
Date: Tue, 3 Jan 2017 14:36:26 +0100
Subject: [PATCH] Use new tcpdump() function to handle sniff() with filter set

---
 scapy/arch/windows/compatibility.py | 22 +++-------------------
 scapy/sendrecv.py                   | 29 +++++------------------------
 scapy/utils.py                      |  5 +----
 3 files changed, 9 insertions(+), 47 deletions(-)

diff --git a/scapy/arch/windows/compatibility.py b/scapy/arch/windows/compatibility.py
index 573d64c4..6c0b3aef 100644
--- a/scapy/arch/windows/compatibility.py
+++ b/scapy/arch/windows/compatibility.py
@@ -19,7 +19,7 @@ from scapy.arch.consts import LOOPBACK_NAME
 from scapy.config import conf,ConfClass
 from scapy.base_classes import Gen, SetGen
 import scapy.plist as plist
-from scapy.utils import PcapReader
+from scapy.utils import PcapReader, tcpdump
 from scapy.arch.pcapdnet import PcapTimeoutElapsed
 from scapy.error import log_runtime
 from scapy.data import MTU, ETH_P_ARP,ETH_P_ALL
@@ -197,24 +197,8 @@ L2socket: use the provided L2socket
         s = L2socket(type=ETH_P_ALL, *arg, **karg)
     else:
         flt = karg.get('filter')
-        if flt is not None:
-            if isinstance(offline, basestring):
-                s = PcapReader(
-                    subprocess.Popen(
-                        [conf.prog.tcpdump, "-r", offline, "-w", "-", flt],
-                        stdout=subprocess.PIPE
-                    ).stdout
-                )
-            else:
-                s = PcapReader(
-                    subprocess.Popen(
-                        [conf.prog.tcpdump, "-r", "-", "-w", "-", flt],
-                        stdin=offline,
-                        stdout=subprocess.PIPE
-                    ).stdout
-                )
-        else:
-            s = PcapReader(offline)
+        s = PcapReader(offline if flt is None else
+                       tcpdump(offline, args=["-w", "-", flt], getfd=True))
     lst = []
     if timeout is not None:
         stoptime = time.time()+timeout
diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py
index 9ca7d480..308c114d 100644
--- a/scapy/sendrecv.py
+++ b/scapy/sendrecv.py
@@ -16,7 +16,7 @@ from scapy.arch.consts import DARWIN, FREEBSD, OPENBSD
 from scapy.data import *
 from scapy.config import conf
 from scapy.packet import Gen
-from scapy.utils import warning,get_temp_file,PcapReader,wrpcap
+from scapy.utils import warning, get_temp_file, PcapReader, tcpdump, wrpcap
 from scapy import plist
 from scapy.error import log_runtime,log_interactive
 from scapy.base_classes import SetGen
@@ -607,29 +607,10 @@ interfaces)
                                            **karg)]
         else:
             flt = karg.get('filter')
-            if flt is not None:
-                if isinstance(offline, basestring):
-                    sniff_sockets = [
-                        PcapReader(
-                            subprocess.Popen(
-                                [conf.prog.tcpdump, "-r", offline, "-w", "-",
-                                 flt],
-                                stdout=subprocess.PIPE
-                            ).stdout
-                        )
-                    ]
-                else:
-                    sniff_sockets = [
-                        PcapReader(
-                            subprocess.Popen(
-                                [conf.prog.tcpdump, "-r", "-", "-w", "-", flt],
-                                stdin=offline,
-                                stdout=subprocess.PIPE
-                            ).stdout
-                        )
-                    ]
-            else:
-                sniff_sockets = [PcapReader(offline)]
+            sniff_sockets = [PcapReader(
+                offline if flt is None else
+                tcpdump(offline, args=["-w", "-", flt], getfd=True)
+            )]
     lst = []
     if timeout is not None:
         stoptime = time.time()+timeout
diff --git a/scapy/utils.py b/scapy/utils.py
index ad5230e0..b26faf05 100644
--- a/scapy/utils.py
+++ b/scapy/utils.py
@@ -1164,10 +1164,7 @@ u'64'
             stdout=subprocess.PIPE if dump or getfd else None,
             stderr=open(os.devnull),
         )
-        def newdel(self, *args, **kargs):
-            os.unlink(tmpfile.name)
-            proc.__del__(self, *args, **kargs)
-        proc.__del__ = newdel
+        conf.temp_files.append(tmpfile.name)
     else:
         proc = subprocess.Popen(
             [conf.prog.tcpdump if prog is None else prog, "-r", "-"]
-- 
GitLab