Skip to content

Commit a1afb9a

Browse files
committed
Fix bugs with _raw_packet_cache_field_value in cache of payloads
1 parent 37d9412 commit a1afb9a

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

scapy/packet.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -664,10 +664,10 @@ def _raw_packet_cache_field_value(self, fld, val, copy=False):
664664
# avoid copying whole packets (perf: #GH3894)
665665
if fld.islist:
666666
return [
667-
_cpy(x.fields) for x in val
667+
(_cpy(x.fields), x.payload.raw_packet_cache) for x in val
668668
]
669669
else:
670-
return _cpy(val.fields)
670+
return (_cpy(val.fields), val.payload.raw_packet_cache)
671671
elif fld.islist or fld.ismutable:
672672
return _cpy(val)
673673
return None

test/fields.uts

+47
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,53 @@ while p.pl:
863863

864864
assert i == 100
865865

866+
= Test cache handling of payload modification in a PacketListField
867+
~ field
868+
869+
# GH4414
870+
class SubPacket(Packet):
871+
fields_desc = [
872+
ByteField("b", 0),
873+
]
874+
875+
class MyPacket(Packet):
876+
fields_desc = [
877+
PacketListField("a", [], SubPacket),
878+
]
879+
880+
881+
p = MyPacket(b"\x00extrapayload")
882+
p.a[0] = SubPacket(b=0) / b"test"
883+
884+
assert bytes(p) == b"\x00test"
885+
886+
= Test cache handling of payload modification in a PacketField
887+
~ field
888+
889+
# also GH4414
890+
class PayloadPacket(Packet):
891+
fields_desc = [
892+
StrField("b", ""),
893+
]
894+
895+
class SubPacket(Packet):
896+
fields_desc = []
897+
898+
bind_layers(SubPacket, PayloadPacket)
899+
900+
class MyPacket(Packet):
901+
fields_desc = [
902+
PacketField("a", None, SubPacket),
903+
]
904+
905+
906+
s = b'test'
907+
p = MyPacket(s)
908+
909+
p[PayloadPacket].b = b'new'
910+
assert p.build() != s
911+
912+
866913
############
867914
############
868915
+ Tests on MultiFlagsField

0 commit comments

Comments
 (0)