From 4e306726ac76d1c25e823bffecbe078eb1006d00 Mon Sep 17 00:00:00 2001 From: Brian Wellington Date: Tue, 10 Oct 2023 11:29:27 -0700 Subject: [PATCH] Fix enum inversion. A change in Python 3.11's enum module caused IntEnum inversion to only invert the bits associated with the (inferred) range of the flag, meaning that ~dns.flags.DO only inverted 16 bits. This meant that calling want_dnssec(False) on a message would unconditionally set the EDNS version field to 0. --- dns/message.py | 2 +- tests/test_message.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/dns/message.py b/dns/message.py index daae6363a..70049efd3 100644 --- a/dns/message.py +++ b/dns/message.py @@ -826,7 +826,7 @@ def want_dnssec(self, wanted: bool = True) -> None: if wanted: self.ednsflags |= dns.flags.DO elif self.opt: - self.ednsflags &= ~dns.flags.DO + self.ednsflags &= ~int(dns.flags.DO) def rcode(self) -> dns.rcode.Rcode: """Return the rcode. diff --git a/tests/test_message.py b/tests/test_message.py index 0eb34d7cf..59ca507b0 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -233,6 +233,18 @@ def test_EDNSVersionCoherence(self): m.use_edns(1) self.assertEqual((m.ednsflags >> 16) & 0xFF, 1) + def test_EDNSVersionCoherenceWithDNSSEC(self): + m = dns.message.make_query("foo", "A") + m.use_edns(1) + m.want_dnssec(True) + self.assertEqual((m.ednsflags >> 16) & 0xFF, 1) + + def test_EDNSVersionCoherenceWithoutDNSSEC(self): + m = dns.message.make_query("foo", "A") + m.use_edns(1) + m.want_dnssec(False) + self.assertEqual((m.ednsflags >> 16) & 0xFF, 1) + def test_SettingNoEDNSOptionsImpliesNoEDNS(self): m = dns.message.make_query("foo", "A") self.assertEqual(m.edns, -1)