From 238a69023a3178267bea52dc4c29ab369cf331c7 Mon Sep 17 00:00:00 2001
From: Jakub Warmuz <jakub.warmuz@gmail.com>
Date: Mon, 9 Aug 2010 15:46:18 +0200
Subject: [PATCH] Deep copy Field's default value during Packet's fields
 initialization.

The Field's default object used to be shared along instances of the Field, ie.:

>>> class A(Packet):
...     fields_desc = [IntField('i', None)]
...
>>> class B(Packet):
...     fields_desc = [PacketListField('a', [], A)]
...
>>> B().a is B().a
True

Fix it, so:
>>> B().a is B().a
False
---
 scapy/packet.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/scapy/packet.py b/scapy/packet.py
index 0accd354..0f834248 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -8,6 +8,7 @@ Packet class. Binding mechanism. fuzz() method.
 """
 
 import time,itertools,os
+import copy
 from fields import StrField,ConditionalField,Emph,PacketListField
 from config import conf
 from base_classes import BasePacket,Gen,SetGen,Packet_metaclass,NewDefaultValues
@@ -93,7 +94,7 @@ class Packet(BasePacket):
 
     def do_init_fields(self, flist):
         for f in flist:
-            self.default_fields[f.name] = f.default
+            self.default_fields[f.name] = copy.deepcopy(f.default)
             self.fieldtype[f.name] = f
             if f.holds_packets:
                 self.packetfields.append(f)
-- 
GitLab