summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Halley <halley@dnspython.org>2012-08-28 13:51:59 -0700
committerBob Halley <halley@dnspython.org>2012-08-28 13:51:59 -0700
commitb05d56031c7ff6bceca4ed8788d49fe8b04a7da6 (patch)
tree1400a61ec7b0d02e61c4a8ad0406d315f6f00145
parentcdf87c2ea5935fc31e2ce7137b4c589de0e091c2 (diff)
downloaddnspython-b05d56031c7ff6bceca4ed8788d49fe8b04a7da6.tar.gz
Do not generate empty NSEC3 bitmap windows
-rw-r--r--ChangeLog6
-rw-r--r--dns/rdtypes/ANY/NSEC3.py6
-rw-r--r--tests/bugs.py5
3 files changed, 15 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 81650fe..8dc39d0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-08-28 Bob Halley <halley@dnspython.org>
+
+ * dns/rdtypes/ANY/NSEC3.py (NSEC3.from_text): The NSEC3 from_text()
+ method could erroneously emit empty bitmap windows (i.e. windows
+ with a count of 0 bytes); such bitmaps are illegal.
+
2012-04-08 Bob Halley <halley@dnspython.org>
* (Version 1.10.0 released)
diff --git a/dns/rdtypes/ANY/NSEC3.py b/dns/rdtypes/ANY/NSEC3.py
index c7ac737..b42fe4c 100644
--- a/dns/rdtypes/ANY/NSEC3.py
+++ b/dns/rdtypes/ANY/NSEC3.py
@@ -114,7 +114,8 @@ class NSEC3(dns.rdata.Rdata):
prior_rdtype = nrdtype
new_window = nrdtype // 256
if new_window != window:
- windows.append((window, ''.join(bitmap[0:octets])))
+ if octets != 0:
+ windows.append((window, ''.join(bitmap[0:octets])))
bitmap = ['\0'] * 32
window = new_window
offset = nrdtype % 256
@@ -122,7 +123,8 @@ class NSEC3(dns.rdata.Rdata):
bit = offset % 8
octets = byte + 1
bitmap[byte] = chr(ord(bitmap[byte]) | (0x80 >> bit))
- windows.append((window, ''.join(bitmap[0:octets])))
+ if octets != 0:
+ windows.append((window, ''.join(bitmap[0:octets])))
return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, windows)
from_text = classmethod(from_text)
diff --git a/tests/bugs.py b/tests/bugs.py
index c2fa6b6..312ec3e 100644
--- a/tests/bugs.py
+++ b/tests/bugs.py
@@ -40,5 +40,10 @@ class BugsTestCase(unittest.TestCase):
ttl = dns.ttl.from_text("2147483648")
self.failUnlessRaises(dns.ttl.BadTTL, bad)
+ def test_empty_NSEC3_window(self):
+ rdata = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.NSEC3,
+ "1 0 100 ABCD SCBCQHKU35969L2A68P3AD59LHF30715")
+ self.failUnless(rdata.windows == [])
+
if __name__ == '__main__':
unittest.main()