From 4eede284cc645963620a0b830d18ef2bb64041e1 Mon Sep 17 00:00:00 2001
From: Pierre LALET <pierre.lalet@cea.fr>
Date: Tue, 19 Jan 2016 15:32:08 +0100
Subject: [PATCH] Fix .do_dissect() (code easier to read and a bit faster)

---
 scapy/packet.py | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/scapy/packet.py b/scapy/packet.py
index 04fb3346..56267b22 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -574,12 +574,11 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
         return s
 
     def do_dissect(self, s):
-        flist = self.fields_desc[:]
-        flist.reverse()
         raw = s
         self.raw_packet_cache_fields = {}
-        while s and flist:
-            f = flist.pop()
+        for f in self.fields_desc:
+            if not s:
+                break
             s, fval = f.getfield(self, s)
             # We need to track fields with mutable values to discard
             # .raw_packet_cache when needed.
@@ -587,10 +586,7 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
                 self.raw_packet_cache_fields[f.name] = f.do_copy(fval)
             self.fields[f.name] = fval
         assert(raw.endswith(s))
-        if s:
-            self.raw_packet_cache = raw[:-len(s)]
-        else:
-            self.raw_packet_cache = raw
+        self.raw_packet_cache = raw[:-len(s)] if s else raw
         self.explicit = 1
         return s
 
-- 
GitLab