From 35145f8c870b309167408599955c77d23d067449 Mon Sep 17 00:00:00 2001 From: Guillaume Valadon <guillaume.valadon@ssi.gouv.fr> Date: Thu, 3 Nov 2016 14:44:03 +0100 Subject: [PATCH] Fixed the invalid copy_flag in some ip options - original patch from Yitai Schwartz, https://bitbucket.org/secdev/scapy/pull-requests/62/ --- scapy/layers/inet.py | 19 ++++++++++--------- test/regression.uts | 12 ++++++------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py index 0101f697..dc262609 100644 --- a/scapy/layers/inet.py +++ b/scapy/layers/inet.py @@ -124,10 +124,9 @@ class IPOption_Security(IPOption): StrFixedLenField("transmission_control_code","xxx",3), ] -class IPOption_LSRR(IPOption): - name = "IP Option Loose Source and Record Route" - copy_flag = 1 - option = 3 +class IPOption_RR(IPOption): + name = "IP Option Record Route" + option = 7 fields_desc = [ _IPOption_HDR, FieldLenField("length", None, fmt="B", length_of="routers", adjust=lambda pkt,l:l+3), @@ -138,16 +137,19 @@ class IPOption_LSRR(IPOption): def get_current_router(self): return self.routers[self.pointer/4-1] -class IPOption_RR(IPOption_LSRR): - name = "IP Option Record Route" - option = 7 +class IPOption_LSRR(IPOption_RR): + name = "IP Option Loose Source and Record Route" + copy_flag = 1 + option = 3 -class IPOption_SSRR(IPOption_LSRR): +class IPOption_SSRR(IPOption_RR): name = "IP Option Strict Source and Record Route" + copy_flag = 1 option = 9 class IPOption_Stream_Id(IPOption): name = "IP Option Stream ID" + copy_flag = 1 option = 8 fields_desc = [ _IPOption_HDR, ByteField("length", 4), @@ -166,7 +168,6 @@ class IPOption_MTU_Reply(IPOption_MTU_Probe): class IPOption_Traceroute(IPOption): name = "IP Option Traceroute" - copy_flag = 1 option = 18 fields_desc = [ _IPOption_HDR, ByteField("length", 12), diff --git a/test/regression.uts b/test/regression.uts index f5996ea0..9455d4eb 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -4486,15 +4486,15 @@ assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c pkt = IP(options=[IPOption_RR()]) / TCP() / ("A" * 10) bpkt = IP(str(pkt)) -assert bpkt.chksum == 0xf0bb and bpkt.payload.chksum == 0x4b2c +assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c pkt = IP(len=54, options=[IPOption_RR()]) / TCP() / ("A" * 10) bpkt = IP(str(pkt)) -assert bpkt.chksum == 0xf0bb and bpkt.payload.chksum == 0x4b2c +assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c pkt = IP(len=54, ihl=6, options=[IPOption_RR()]) / TCP() / ("A" * 10) bpkt = IP(str(pkt)) -assert bpkt.chksum == 0xf0bb and bpkt.payload.chksum == 0x4b2c +assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c pkt = IP() / UDP() bpkt = IP(str(pkt)) @@ -4522,15 +4522,15 @@ assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17 pkt = IP(options=[IPOption_RR()]) / UDP() / ("A" * 10) bpkt = IP(str(pkt)) -assert bpkt.chksum == 0xf0bc and bpkt.payload.chksum == 0xbb17 +assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 pkt = IP(len=42, options=[IPOption_RR()]) / UDP() / ("A" * 10) bpkt = IP(str(pkt)) -assert bpkt.chksum == 0xf0bc and bpkt.payload.chksum == 0xbb17 +assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 pkt = IP(len=42, ihl=6, options=[IPOption_RR()]) / UDP() / ("A" * 10) bpkt = IP(str(pkt)) -assert bpkt.chksum == 0xf0bc and bpkt.payload.chksum == 0xbb17 +assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 = Layer binding -- GitLab