were not a multiple of 8 bits.
Instead of preserving the required number of high-order bits, it
cleared that number of low-order bits. Thanks to Brian Wellington for
discovering this and providing the correct code.
self.addrdata = addrdata[:nbytes]
nbits = srclen % 8
if nbits != 0:
- last = struct.pack('B', ord(self.addrdata[-1:]) & (0xff << nbits))
+ last = struct.pack('B',
+ ord(self.addrdata[-1:]) & (0xff << (8 - nbits)))
self.addrdata = self.addrdata[:-1] + last
def to_text(self):
data = io.getvalue()
self.assertEqual(data, b'\x00\x01\x18\x00\x01\x02\x03')
+ def testECSOption25(self):
+ opt = dns.edns.ECSOption('1.2.3.255', 25)
+ io = BytesIO()
+ opt.to_wire(io)
+ data = io.getvalue()
+ self.assertEqual(data, b'\x00\x01\x19\x00\x01\x02\x03\x80')
+
def testECSOption_v6(self):
opt = dns.edns.ECSOption('2001:4b98::1')
io = BytesIO()