Skip to content

Commit 027f4d4

Browse files
guedoushapaz
andauthored
Fix defragment6 (bug #4228) (#4631)
* Fixed fragment data size in IPv6 defragmentation * Support IPv6.plen=None in defragment6 * Use the known size * Unit test added --------- Co-authored-by: shapaz <[email protected]>
1 parent 83f8bc4 commit 027f4d4

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

scapy/layers/inet6.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,13 +1188,17 @@ def defragment6(packets):
11881188

11891189
# regenerate the fragmentable part
11901190
fragmentable = b""
1191+
frag_hdr_len = 8
11911192
for p in res:
11921193
q = p[IPv6ExtHdrFragment]
11931194
offset = 8 * q.offset
11941195
if offset != len(fragmentable):
11951196
warning("Expected an offset of %d. Found %d. Padding with XXXX" % (len(fragmentable), offset)) # noqa: E501
1197+
frag_data_len = p[IPv6].plen
1198+
if frag_data_len is not None:
1199+
frag_data_len -= frag_hdr_len
11961200
fragmentable += b"X" * (offset - len(fragmentable))
1197-
fragmentable += raw(q.payload)
1201+
fragmentable += raw(q.payload)[:frag_data_len]
11981202

11991203
# Regenerate the unfragmentable part.
12001204
q = res[0].copy()

test/scapy/layers/inet6.uts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,6 +1904,11 @@ pkts = fragment6(IPv6()/IPv6ExtHdrFragment()/UDP(dport=42, sport=42)/Raw(load="A
19041904
pkts = [IPv6(raw(p)) for p in pkts]
19051905
assert defragment6(pkts).plen == 1508
19061906

1907+
= defragment6 - discard payload
1908+
pkt = Ether() / IPv6() / ICMPv6EchoRequest(data='b'*100)
1909+
frags = fragment6(pkt, 100)
1910+
pkt = defragment6(Ether(raw(frag / Padding(b'a' * 8))) for frag in frags)
1911+
assert b'a' not in pkt.data
19071912

19081913
############
19091914
############

0 commit comments

Comments
 (0)