From cd588cfd7528d26995b59f91696a162b325e95ce Mon Sep 17 00:00:00 2001
From: Pierre LALET <pierre.lalet@cea.fr>
Date: Sat, 16 Sep 2017 21:22:23 +0200
Subject: [PATCH] Try to read the manufacturer DB from various places

---
 scapy/data.py | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/scapy/data.py b/scapy/data.py
index f129cb27..65d84ca2 100644
--- a/scapy/data.py
+++ b/scapy/data.py
@@ -161,9 +161,9 @@ class ManufDA(DADict):
         
 
 def load_manuf(filename):
-    try:
-        manufdb=ManufDA(_name=filename)
-        for l in open(filename, "rb"):
+    manufdb=ManufDA(_name=filename)
+    with open(filename, "rb") as fdesc:
+        for l in fdesc:
             try:
                 l = l.strip()
                 if not l or l.startswith(b"#"):
@@ -175,27 +175,37 @@ def load_manuf(filename):
                 else:
                     lng = l[i+2:]
                 manufdb[oui] = shrt, lng
-            except Exception as e:
-                log_loading.warning("Couldn't parse one line from [%s] [%r] (%s)" % (filename, l, e))
-    except IOError:
-        log_loading.warning("Couldn't open [%s] file" % filename)
-        return ""
+            except Exception:
+                log_loading.warning("Couldn't parse one line from [%s] [%r]",
+                                    filename, l, exc_info=True)
     return manufdb
     
 
-
 if WINDOWS:
     ETHER_TYPES=load_ethertypes("ethertypes")
     IP_PROTOS=load_protocols(os.environ["SystemRoot"]+"\system32\drivers\etc\protocol")
     TCP_SERVICES,UDP_SERVICES=load_services(os.environ["SystemRoot"] + "\system32\drivers\etc\services")
     # Default value, will be updated by arch.windows
-    MANUFDB = load_manuf(os.environ["ProgramFiles"] + "\\wireshark\\manuf")
+    try:
+        MANUFDB = load_manuf(os.environ["ProgramFiles"] + "\\wireshark\\manuf")
+    except IOError:
+        log_loading.warning("Cannot read [%s]", filename)
+        MANUFDB = None
 else:
     IP_PROTOS=load_protocols("/etc/protocols")
     ETHER_TYPES=load_ethertypes("/etc/ethertypes")
     TCP_SERVICES,UDP_SERVICES=load_services("/etc/services")
-    MANUFDB = load_manuf("/usr/share/wireshark/manuf")
-
+    MANUFDB = None
+    for prefix in ['/usr', '/usr/local', '/opt', '/opt/wireshark']:
+        try:
+            MANUFDB = load_manuf(os.path.join(prefix, "share", "wireshark",
+                                              "manuf"))
+            if MANUFDB:
+                break
+        except IOError:
+            pass
+    if not MANUFDB:
+        log_loading.warning("Cannot read wireshark manuf database")
 
 
 #####################
-- 
GitLab