From 2a8733aba89a0a1a7286d37c351b63a4dc1d4e81 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Sat, 19 Dec 2020 19:24:30 -0800 Subject: [PATCH] Support bytearray and memoryview as raw payload --- scapy/packet.py | 14 +++++++------- test/regression.uts | 12 ++++++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/scapy/packet.py b/scapy/packet.py index a13a9c0b30e..7ded839edf6 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -356,10 +356,10 @@ def add_payload(self, payload): if t in payload.overload_fields: self.overloaded_fields = payload.overload_fields[t] break - elif isinstance(payload, bytes): - self.payload = conf.raw_layer(load=payload) + elif isinstance(payload, (bytes, str, bytearray, memoryview)): + self.payload = conf.raw_layer(load=bytes_encode(payload)) else: - raise TypeError("payload must be either 'Packet' or 'bytes', not [%s]" % repr(payload)) # noqa: E501 + raise TypeError("payload must be 'Packet', 'bytes', 'str', 'bytearray', or 'memoryview', not [%s]" % repr(payload)) # noqa: E501 def remove_payload(self): # type: () -> None @@ -577,16 +577,16 @@ def __div__(self, other): cloneB = other.copy() cloneA.add_payload(cloneB) return cloneA - elif isinstance(other, (bytes, str, bytearray)): - return self / conf.raw_layer(load=other) + elif isinstance(other, (bytes, str, bytearray, memoryview)): + return self / conf.raw_layer(load=bytes_encode(other)) else: return other.__rdiv__(self) # type: ignore __truediv__ = __div__ def __rdiv__(self, other): # type: (Any) -> Packet - if isinstance(other, (bytes, str, bytearray)): - return conf.raw_layer(load=other) / self + if isinstance(other, (bytes, str, bytearray, memoryview)): + return conf.raw_layer(load=bytes_encode(other)) / self else: raise TypeError __rtruediv__ = __rdiv__ diff --git a/test/regression.uts b/test/regression.uts index 3a627fb14ea..14fdeaccd59 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -1000,6 +1000,18 @@ a=3 assert bytes(Raw("sca")/"py") == b"scapy" assert bytes(Raw("sca")/b"py") == b"scapy" assert bytes(Raw("sca")/bytearray(b"py")) == b"scapy" +assert bytes("sca"/Raw("py")) == b"scapy" +assert bytes(b"sca"/Raw("py")) == b"scapy" +assert bytes(bytearray(b"sca")/Raw("py")) == b"scapy" +a=Raw("sca") +a.add_payload("py") +assert bytes(a) == b"scapy" +a=Raw("sca") +a.add_payload(b"py") +assert bytes(a) == b"scapy" +a=Raw("sca") +a.add_payload(bytearray(b"py")) +assert bytes(a) == b"scapy" = Checking overloads ~ basic IP TCP Ether