From b610145b46cc5a33c0cef8a3bc9e7a7ea755aa4d Mon Sep 17 00:00:00 2001 From: Pierre LALET <pierre.lalet@cea.fr> Date: Mon, 8 Feb 2016 19:41:02 +0100 Subject: [PATCH] Packet().overload_fields can be overwritten This is needed by fragment(), which has been broken since PR #11. --- scapy/base_classes.py | 7 +++++-- scapy/layers/isakmp.py | 2 +- scapy/packet.py | 18 ++++++++++-------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/scapy/base_classes.py b/scapy/base_classes.py index 83f8bff1..1ff6c9e9 100644 --- a/scapy/base_classes.py +++ b/scapy/base_classes.py @@ -180,8 +180,11 @@ class Packet_metaclass(type): if "__slots__" not in dct: dct["__slots__"] = [] - if "name" in dct: - dct["_name"] = dct.pop("name") + for attr in ["name", "overload_fields"]: + try: + dct["_%s" % attr] = dct.pop(attr) + except KeyError: + pass newcls = super(Packet_metaclass, cls).__new__(cls, name, bases, dct) newcls.__all_slots__ = set( attr diff --git a/scapy/layers/isakmp.py b/scapy/layers/isakmp.py index e7ab564b..4d96a626 100644 --- a/scapy/layers/isakmp.py +++ b/scapy/layers/isakmp.py @@ -337,7 +337,7 @@ for i, payloadname in enumerate(ISAKMP_payload_type): ISAKMP_payload_type_overload[globals()[name]] = {"next_payload": i} del i, payloadname, name -ISAKMP_class.overload_fields = ISAKMP_payload_type_overload.copy() +ISAKMP_class._overload_fields = ISAKMP_payload_type_overload.copy() bind_layers( UDP, ISAKMP, dport=500, sport=500) diff --git a/scapy/packet.py b/scapy/packet.py index 2573eaa3..1e10df3e 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -36,7 +36,8 @@ class RawVal: class Packet(BasePacket): __slots__ = [ "time", "sent_time", "name", "default_fields", - "overloaded_fields", "fields", "fieldtype", "packetfields", + "overload_fields", "overloaded_fields", "fields", "fieldtype", + "packetfields", "original", "explicit", "raw_packet_cache", "raw_packet_cache_fields", "_pkt", "post_transforms", # then payload and underlayer @@ -64,7 +65,7 @@ class Packet(BasePacket): @classmethod def lower_bonds(self): - for lower,fval in self.overload_fields.iteritems(): + for lower,fval in self._overload_fields.iteritems(): print "%-20s %s" % (lower.__name__, ", ".join("%-12s" % ("%s=%r"%i) for i in fval.iteritems())) def __init__(self, _pkt="", post_transform=None, _internal=0, _underlayer=None, **fields): @@ -74,6 +75,7 @@ class Packet(BasePacket): if self._name is None else self._name) self.default_fields = {} + self.overload_fields = self._overload_fields self.overloaded_fields = {} self.fields = {} self.fieldtype = {} @@ -1189,8 +1191,8 @@ def bind_bottom_up(lower, upper, __fval=None, **fval): def bind_top_down(lower, upper, __fval=None, **fval): if __fval is not None: fval.update(__fval) - upper.overload_fields = upper.overload_fields.copy() - upper.overload_fields[lower] = fval + upper._overload_fields = upper._overload_fields.copy() + upper._overload_fields[lower] = fval @conf.commands.register def bind_layers(lower, upper, __fval=None, **fval): @@ -1215,13 +1217,13 @@ def split_bottom_up(lower, upper, __fval=None, **fval): def split_top_down(lower, upper, __fval=None, **fval): if __fval is not None: fval.update(__fval) - if lower in upper.overload_fields: - ofval = upper.overload_fields[lower] + if lower in upper._overload_fields: + ofval = upper._overload_fields[lower] for k in fval: if k not in ofval or ofval[k] != fval[k]: return - upper.overload_fields = upper.overload_fields.copy() - del(upper.overload_fields[lower]) + upper._overload_fields = upper._overload_fields.copy() + del(upper._overload_fields[lower]) @conf.commands.register def split_layers(lower, upper, __fval=None, **fval): -- GitLab