diff --git a/scapy/packet.py b/scapy/packet.py index 9133fbfaddb..471b1bc41d5 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -593,9 +593,12 @@ def setfieldval(self, attr, val): self.raw_packet_cache = None self.raw_packet_cache_fields = None self.wirelen = None + self.firstlayer().wirelen = None elif attr == "payload": self.remove_payload() self.add_payload(val) + self.wirelen = None + self.firstlayer().wirelen = None else: self.payload.setfieldval(attr, val) @@ -617,6 +620,7 @@ def delfieldval(self, attr): self.raw_packet_cache = None self.raw_packet_cache_fields = None self.wirelen = None + self.firstlayer().wirelen = None elif attr in self.default_fields: pass elif attr == "payload": @@ -781,6 +785,8 @@ def clear_cache(self): # type: () -> None """Clear the raw packet cache for the field and all its subfields""" self.raw_packet_cache = None + self.wirelen = None + self.firstlayer().wirelen = None for fname, fval in self.fields.items(): fld = self.get_field(fname) if fld.holds_packets: diff --git a/test/regression.uts b/test/regression.uts index 1807df69758..e5e74ef8529 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -2629,6 +2629,18 @@ assert newpktpcapwirelen[0].wirelen is not None assert len(newpktpcapwirelen[0]) < newpktpcapwirelen[0].wirelen assert newpktpcapwirelen[0].wirelen == pktpcapwirelen[0].wirelen += Check wrpcap() resets wirelen after a nested length change +filename1 = get_temp_file(autoext=".pcap") +filename2 = get_temp_file(autoext=".pcap") +wrpcap(filename1, [Ether()/Raw(b"a")]) +pkt = rdpcap(filename1)[0] +assert pkt.wirelen == len(pkt) +pkt[Raw].load = b"abcdef" +wrpcap(filename2, [pkt]) +newpkt = rdpcap(filename2)[0] +assert newpkt[Raw].load == b"abcdef" +assert newpkt.wirelen == len(newpkt) + = Check wrpcap() then rdpcap() with sent_time on SndRcvList f = get_temp_file() s = Ether()/IP()