Skip to content

Commit cbd48fa

Browse files
authored
Merge pull request #2768 from gpotter2/pickle
Improve packet pickling
2 parents b45f2dd + fd8a7b9 commit cbd48fa

2 files changed

Lines changed: 27 additions & 15 deletions

File tree

scapy/packet.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,26 +103,30 @@ def lower_bonds(self):
103103
for lower, fval in six.iteritems(self._overload_fields):
104104
print("%-20s %s" % (lower.__name__, ", ".join("%-12s" % ("%s=%r" % i) for i in six.iteritems(fval)))) # noqa: E501
105105

106-
def _unpickle(self, dlist):
107-
"""Used to unpack pickling"""
108-
self.__init__(b"".join(dlist))
109-
return self
110-
111106
def __reduce__(self):
112107
"""Used by pickling methods"""
113-
return (self.__class__, (), (self.build(),))
114-
115-
def __reduce_ex__(self, proto):
116-
"""Used by pickling methods"""
117-
return self.__reduce__()
108+
return (self.__class__, (), (
109+
self.build(),
110+
self.time,
111+
self.sent_time,
112+
self.direction,
113+
self.sniffed_on,
114+
self.wirelen,
115+
))
118116

119117
def __getstate__(self):
120118
"""Mark object as pickable"""
121119
return self.__reduce__()[2]
122120

123121
def __setstate__(self, state):
124122
"""Rebuild state using pickable methods"""
125-
return self._unpickle(state)
123+
self.__init__(state[0])
124+
self.time = state[1]
125+
self.sent_time = state[2]
126+
self.direction = state[3]
127+
self.sniffed_on = state[4]
128+
self.wirelen = state[5]
129+
return self
126130

127131
def __deepcopy__(self, memo):
128132
"""Used by copy.deepcopy"""
@@ -148,6 +152,8 @@ def __init__(self, _pkt=b"", post_transform=None, _internal=0, _underlayer=None,
148152
self.raw_packet_cache = None
149153
self.raw_packet_cache_fields = None
150154
self.wirelen = None
155+
self.direction = None
156+
self.sniffed_on = None
151157
if _pkt:
152158
self.dissect(_pkt)
153159
if not _internal:

test/regression.uts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13279,13 +13279,19 @@ if PYX and not six.PY2:
1327913279
import pickle
1328013280

1328113281
frm = Ether(src='00:11:22:33:44:55', dst='00:22:33:44:55:66')/Raw()
13282+
frm.time = EDecimal(123.45)
13283+
frm.sniffed_on = "iface"
13284+
frm.wirelen = 1
1328213285
pl = PacketList(res=[frm, frm], name='WhatAGreatName')
1328313286
pickled = pickle.dumps(pl)
1328413287
pl = pickle.loads(pickled)
13285-
assert(pl.listname == "WhatAGreatName")
13286-
assert(len(pl) == 2)
13287-
assert(pl[0][Ether].src == '00:11:22:33:44:55')
13288-
assert(pl[1][Ether].dst == '00:22:33:44:55:66')
13288+
assert pl.listname == "WhatAGreatName"
13289+
assert len(pl) == 2
13290+
assert pl[0].time == 123.45
13291+
assert pl[0].sniffed_on == "iface"
13292+
assert pl[0].wirelen == 1
13293+
assert pl[0][Ether].src == '00:11:22:33:44:55'
13294+
assert pl[1][Ether].dst == '00:22:33:44:55:66'
1328913295

1329013296

1329113297
############

0 commit comments

Comments
 (0)