From 8c276e2536058efc28a4fc71b7306c2a069deb65 Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Mon, 9 Jan 2017 06:10:39 -0800 Subject: [PATCH] Raise IndexError in Answer get and delete if rrset is None. Thanks to mschwager for reporting this. [Issue #226]. --- dns/resolver.py | 4 ++++ tests/test_resolver.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/dns/resolver.py b/dns/resolver.py index abc431d7..e63eefcc 100644 --- a/dns/resolver.py +++ b/dns/resolver.py @@ -278,9 +278,13 @@ class Answer(object): return self.rrset and iter(self.rrset) or iter(tuple()) def __getitem__(self, i): + if self.rrset is None: + raise IndexError return self.rrset[i] def __delitem__(self, i): + if self.rrset is None: + raise IndexError del self.rrset[i] diff --git a/tests/test_resolver.py b/tests/test_resolver.py index 1f366259..35372273 100644 --- a/tests/test_resolver.py +++ b/tests/test_resolver.py @@ -134,6 +134,26 @@ class BaseResolverTests(unittest.TestCase): self.failUnless(cache.get((name, dns.rdatatype.A, dns.rdataclass.IN)) is None) + def testIndexErrorOnEmptyRRsetAccess(self): + def bad(): + message = dns.message.from_text(message_text) + name = dns.name.from_text('example.') + answer = dns.resolver.Answer(name, dns.rdatatype.MX, + dns.rdataclass.IN, message, + False) + return answer[0] + self.failUnlessRaises(IndexError, bad) + + def testIndexErrorOnEmptyRRsetDelete(self): + def bad(): + message = dns.message.from_text(message_text) + name = dns.name.from_text('example.') + answer = dns.resolver.Answer(name, dns.rdatatype.MX, + dns.rdataclass.IN, message, + False) + del answer[0] + self.failUnlessRaises(IndexError, bad) + @unittest.skipIf(not _network_available, "Internet not reachable") def testZoneForName1(self): name = dns.name.from_text('www.dnspython.org.') -- 2.47.3