diff --git a/scapy/packet.py b/scapy/packet.py index a5dd9f2dbab180664fc7c3a0f5a77d0dfadebdf5..36ce3890d7499c363912ecba8a0bc777b76b3a6c 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -145,16 +145,16 @@ class Packet(BasePacket): def copy(self): """Returns a deep copy of the instance.""" clone = self.__class__() - clone.fields = self.fields.copy() - for k in clone.fields: - clone.fields[k] = self.get_field(k).do_copy(clone.fields[k]) - clone.default_fields = self.default_fields.copy() + clone.fields = self.copy_fields_dict(self.fields) + clone.default_fields = self.copy_fields_dict(self.default_fields) clone.overloaded_fields = self.overloaded_fields.copy() clone.overload_fields = self.overload_fields.copy() clone.underlayer = self.underlayer clone.explicit = self.explicit clone.raw_packet_cache = self.raw_packet_cache - clone.raw_packet_cache_fields = self.clone_raw_packet_cache_fields() + clone.raw_packet_cache_fields = self.copy_fields_dict( + self.raw_packet_cache_fields + ) clone.post_transforms = self.post_transforms[:] clone.__dict__["payload"] = self.payload.copy() clone.payload.add_underlayer(clone) @@ -299,12 +299,13 @@ class Packet(BasePacket): return True def __len__(self): return len(self.__str__()) - def clone_raw_packet_cache_fields(self): - if self.raw_packet_cache_fields is None: + def copy_field_value(self, fieldname, value): + return self.get_field(fieldname).do_copy(value) + def copy_fields_dict(self, fields): + if fields is None: return None - return {fieldname: self.get_field(fieldname).do_copy(value) - for fieldname, value in - self.raw_packet_cache_fields.iteritems()} + return {fname: self.copy_field_value(fname, fval) + for fname, fval in fields.iteritems()} def self_build(self, field_pos_list=None): if self.raw_packet_cache is not None: for fname, fval in self.raw_packet_cache_fields.iteritems(): @@ -651,12 +652,15 @@ Creates an EPS file describing a packet. If filename is not provided a temporary pkt = self.__class__() pkt.explicit = 1 pkt.fields = kargs + pkt.default_fields = self.copy_fields_dict(self.default_fields) pkt.time = self.time pkt.underlayer = self.underlayer pkt.overload_fields = self.overload_fields.copy() pkt.post_transforms = self.post_transforms pkt.raw_packet_cache = self.raw_packet_cache - pkt.raw_packet_cache_fields = self.clone_raw_packet_cache_fields() + pkt.raw_packet_cache_fields = self.copy_fields_dict( + self.raw_packet_cache_fields + ) if payload is not None: pkt.add_payload(payload) return pkt