From 50915ed7aab90ea997e26ef42a5b1d646cc9d14f Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Tue, 14 Dec 2010 13:48:43 +0100
Subject: [PATCH] Fix PadField.getfield() pad length calculation (ticket #358)

---
 scapy/fields.py     | 11 +++++++----
 test/regression.uts |  7 +++++++
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/scapy/fields.py b/scapy/fields.py
index 914d320d..0bd480ac 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -158,14 +158,17 @@ class PadField:
         self._align = align
         self._padwith = padwith or ""
 
+    def padlen(self, flen):
+        return -flen%self._align
+
     def getfield(self, pkt, s):
-        x = self._fld.getfield(pkt,s)
-        padlen = ((self._align - (len(x[1]) % self._align)) % self._align)
-        return x[0][padlen:], x[1]
+        remain,val = self._fld.getfield(pkt,s)
+        padlen = self.padlen(len(s)-len(remain))
+        return remain[padlen:], val
 
     def addfield(self, pkt, s, val):
         sval = self._fld.addfield(pkt, "", val)
-        return s+sval+struct.pack("%is" % (-len(sval)%self._align), self._padwith)
+        return s+sval+struct.pack("%is" % (self.padlen(len(sval))), self._padwith)
     
     def __getattr__(self, attr):
         return getattr(self._fld,attr)
diff --git a/test/regression.uts b/test/regression.uts
index 069c617d..ee7e7140 100644
--- a/test/regression.uts
+++ b/test/regression.uts
@@ -135,6 +135,13 @@ assert( _.len == 23 and len(_) == 26 )
 IP(str(IP()/Raw("ABC")/Padding("abc")/Padding("def")))
 assert( _.len == 23 and len(_) == 29 )
 
+= PadField test
+~ PadField padding
+
+class TestPad(Packet):
+    fields_desc = [ PadField(StrNullField("st", ""),4), StrField("id", "")]
+
+TestPad() == TestPad(str(TestPad()))
 
 
 ############
-- 
GitLab