From 72d7f9d01e264002f28d3ff338b12f236be41350 Mon Sep 17 00:00:00 2001 From: wenxuan70 Date: Fri, 13 Mar 2026 19:27:55 +0800 Subject: [PATCH] fix _packet_subnet calculation logic --- scapy/layers/dns.py | 19 ++++++++----------- test/scapy/layers/dns.uts | 3 +++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/scapy/layers/dns.py b/scapy/layers/dns.py index 3177ee38186..c6d0eceaaf7 100644 --- a/scapy/layers/dns.py +++ b/scapy/layers/dns.py @@ -558,34 +558,31 @@ def m2i(self, pkt, x): x = x[: operator.floordiv(self.af_length, 8)] return inet_ntop(self.af_familly, x) - def _pack_subnet(self, subnet): - # type: (bytes) -> bytes + def _pack_subnet(self, subnet, pkt): + # type: (bytes, Packet) -> bytes packed_subnet = inet_pton(self.af_familly, plain_str(subnet)) - for i in list(range(operator.floordiv(self.af_length, 8)))[::-1]: - if packed_subnet[i] != 0: - i += 1 - break - return packed_subnet[:i] + sz = operator.floordiv(self.length_from(pkt) + 7, 8) + return packed_subnet[:sz] def i2m(self, pkt, x): # type: (Optional[Packet], Optional[Union[str, Net]]) -> bytes if x is None: return self.af_default try: - return self._pack_subnet(x) + return self._pack_subnet(x, pkt) except (OSError, socket.error): pkt.family = 2 - return ClientSubnetv6("", "")._pack_subnet(x) + return ClientSubnetv6("", "")._pack_subnet(x, pkt) def i2len(self, pkt, x): # type: (Packet, Any) -> int if x is None: return 1 try: - return len(self._pack_subnet(x)) + return len(self._pack_subnet(x, pkt)) except (OSError, socket.error): pkt.family = 2 - return len(ClientSubnetv6("", "")._pack_subnet(x)) + return len(ClientSubnetv6("", "")._pack_subnet(x, pkt)) class ClientSubnetv6(ClientSubnetv4): diff --git a/test/scapy/layers/dns.uts b/test/scapy/layers/dns.uts index d0beb222edf..04eca4ba636 100644 --- a/test/scapy/layers/dns.uts +++ b/test/scapy/layers/dns.uts @@ -520,3 +520,6 @@ for i in pkt: b = b'\x00\x08\x00\x0c\x00\x02=\x00+\xaf\xa3\xc4\xed\xeeW\xb8' p = EDNS0ClientSubnet(b) assert p.source_plen == 61 and p.address == '2baf:a3c4:edee:57b8::' + +b = EDNS0ClientSubnet(source_plen=23, address='101.132.0.0') +assert bytes(b) == b'\x00\x08\x00\x07\x00\x01\x17\x00e\x84\x00' \ No newline at end of file