From 33ac58f2abac2a969c73bb162dbd53a3dbe9507d Mon Sep 17 00:00:00 2001 From: Sigmund Augdal Date: Thu, 21 Feb 2019 12:39:34 +0100 Subject: [PATCH] Fix exception when parsing certain generate statements --- dns/zone.py | 4 ++-- tests/test_generate.py | 52 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/dns/zone.py b/dns/zone.py index 9f552ad0..5310a358 100644 --- a/dns/zone.py +++ b/dns/zone.py @@ -747,10 +747,10 @@ class _MasterReader(object): base = 'd' g3 = is_generate3.match(side) if g3: - mod, sign, offset, width = g1.groups() + mod, sign, offset, width = g3.groups() if sign == '': sign = '+' - width = g1.groups()[2] + width = g3.groups()[2] base = 'd' if not (g1 or g2 or g3): diff --git a/tests/test_generate.py b/tests/test_generate.py index e06e9c64..d7e5dbe0 100644 --- a/tests/test_generate.py +++ b/tests/test_generate.py @@ -131,6 +131,17 @@ ns2 3600 IN A 10.0.0.2 $GENERATE 27-28 $.2 PTR zlb${-26}.oob """ +example_text11 = """$TTL 1h +@ 3600 IN SOA foo bar 1 2 3 4 5 +@ 3600 IN NS ns1 +@ 3600 IN NS ns2 +bar.foo 300 IN MX 0 blaz.foo +ns1 3600 IN A 10.0.0.1 +ns2 3600 IN A 10.0.0.2 +$GENERATE 27-28 prefix-${0,3} A 10.0.0.$ +""" + + def _rdata_sort(a): return (a[0], a[2].rdclass, a[2].to_text()) @@ -495,6 +506,47 @@ class GenerateTestCase(unittest.TestCase): exl.sort(key=_rdata_sort) self.failUnless(l == exl) + def testGenerate8(self): # type: () -> None + z = dns.zone.from_text(example_text11, 'example.', relativize=True) + l = list(z.iterate_rdatas()) + l.sort(key=_rdata_sort) + exl = [(dns.name.from_text('@', None), + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, + 'ns1')), + (dns.name.from_text('@', None), + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NS, + 'ns2')), + (dns.name.from_text('@', None), + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SOA, + 'foo bar 1 2 3 4 5')), + (dns.name.from_text('bar.foo', None), + 300, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.MX, + '0 blaz.foo')), + + (dns.name.from_text('prefix-27', None), 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, + '10.0.0.27')), + + (dns.name.from_text('prefix-28', None), 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, + '10.0.0.28')), + + (dns.name.from_text('ns1', None), + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, + '10.0.0.1')), + (dns.name.from_text('ns2', None), + 3600, + dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, + '10.0.0.2'))] + + exl.sort(key=_rdata_sort) + self.failUnless(l == exl) + if __name__ == '__main__': unittest.main() -- 2.47.3