From b5d7f091ef4ac1156a3918cc5bef1d251ee40ec0 Mon Sep 17 00:00:00 2001 From: Pierre LALET <pierre.lalet@cea.fr> Date: Mon, 28 Mar 2016 20:12:51 +0200 Subject: [PATCH] Fix TCP & UDP checksums when IP layer has options Reported by Runa Barik on Scapy ML. --- scapy/layers/inet.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py index e26c4ef2..1807d19d 100644 --- a/scapy/layers/inet.py +++ b/scapy/layers/inet.py @@ -457,7 +457,12 @@ class TCP(Packet): if self.chksum is None: if isinstance(self.underlayer, IP): if self.underlayer.len is not None: - ln = self.underlayer.len-20 + if self.underlayer.ihl is None: + olen = sum(len(x) for x in self.underlayer.options) + ihl = 5 + olen / 4 + (1 if olen % 4 else 0) + else: + ihl = self.underlayer.ihl + ln = self.underlayer.len - 4 * ihl else: ln = len(p) psdhdr = struct.pack("!4s4sHH", @@ -511,7 +516,12 @@ class UDP(Packet): if self.chksum is None: if isinstance(self.underlayer, IP): if self.underlayer.len is not None: - ln = self.underlayer.len-20 + if self.underlayer.ihl is None: + olen = sum(len(x) for x in self.underlayer.options) + ihl = 5 + olen / 4 + (1 if olen % 4 else 0) + else: + ihl = self.underlayer.ihl + ln = self.underlayer.len - 4 * ihl else: ln = len(p) psdhdr = struct.pack("!4s4sHH", -- GitLab