From f5a5e7285362d4be5163ca9f3eed0f355862d24b Mon Sep 17 00:00:00 2001 From: Phil <phil@secdev.org> Date: Tue, 12 Feb 2008 13:03:15 +0100 Subject: [PATCH] Made setattr/delattr on fields consistent with getattr, i.e. work on payloads Added Packet.setfieldval() and Packet.delfieldval() (Ticket #86) --- scapy.py | 62 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/scapy.py b/scapy.py index 2e9227ef..7e53bf8f 100755 --- a/scapy.py +++ b/scapy.py @@ -5252,33 +5252,49 @@ class Packet(Gen): return v raise AttributeError(attr) + def setfieldval(self, attr, val): + if self.default_fields.has_key(attr): + fld = self.get_field(attr) + if fld is None: + any2i = lambda x,y: y + else: + any2i = fld.any2i + self.fields[attr] = any2i(self, val) + self.explicit=0 + elif attr == "payload": + self.remove_payload() + self.add_payload(val) + else: + self.payload.setfieldval(attr,val) + def __setattr__(self, attr, val): if self.initialized: - if self.default_fields.has_key(attr): - fld = self.get_field(attr) - if fld is None: - any2i = lambda x,y: y - else: - any2i = fld.any2i - self.fields[attr] = any2i(self, val) - self.explicit=0 - elif attr == "payload": - self.remove_payload() - self.add_payload(val) + try: + self.setfieldval(attr,val) + except AttributeError: + pass else: - self.__dict__[attr] = val + return + self.__dict__[attr] = val + + def delfieldval(self, attr): + if self.fields.has_key(attr): + del(self.fields[attr]) + self.explicit=0 # in case a default value must be explicited + elif self.default_fields.has_key(attr): + pass + elif attr == "payload": + self.remove_payload() else: - self.__dict__[attr] = val + self.payload.delfieldval(attr) + def __delattr__(self, attr): if self.initialized: - if self.fields.has_key(attr): - del(self.fields[attr]) - self.explicit=0 # in case a default value must be explicited - return - elif self.default_fields.has_key(attr): - return - elif attr == "payload": - self.remove_payload() + try: + self.delfieldval(attr) + except AttributeError: + pass + else: return if self.__dict__.has_key(attr): del(self.__dict__[attr]) @@ -6069,6 +6085,10 @@ class NoPayload(Packet,object): raise AttributeError(attr) def getfield_and_val(self, attr): raise AttributeError(attr) + def setfieldval(self, attr, val): + raise AttributeError(attr) + def delfieldval(self, attr): + raise AttributeError(attr) def __getattr__(self, attr): if attr in self.__dict__: return self.__dict__[attr] -- GitLab