summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dns/name.py2
-rw-r--r--tests/name.py42
2 files changed, 43 insertions, 1 deletions
diff --git a/dns/name.py b/dns/name.py
index 615e4c6..3d61531 100644
--- a/dns/name.py
+++ b/dns/name.py
@@ -532,6 +532,8 @@ def from_text(text, origin = root):
total = 0
else:
label += c
+ if escaping:
+ raise BadEscape
if len(label) > 0:
labels.append(label)
else:
diff --git a/tests/name.py b/tests/name.py
index 3a0e334..8578d57 100644
--- a/tests/name.py
+++ b/tests/name.py
@@ -49,6 +49,46 @@ class NameTestCase(unittest.TestCase):
n = dns.name.from_text('foo.bar.')
self.failUnless(n.labels == ('foo', 'bar', ''))
+ def testTortureFromText(self):
+ good = [
+ r'.',
+ r'a',
+ r'a.',
+ r'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+ r'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+ r'\000.\008.\010.\032.\046.\092.\099.\255',
+ r'\\',
+ r'\..\.',
+ r'\\.\\',
+ r'!"#%&/()=+-',
+ r'\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255.\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255.\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255.\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255',
+ ]
+ bad = [
+ r'..',
+ r'.a',
+ r'\\..',
+ '\\', # yes, we don't want the 'r' prefix!
+ r'\0',
+ r'\00',
+ r'\00Z',
+ r'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+ r'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
+ r'\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255.\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255.\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255.\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255',
+ ]
+ for t in good:
+ try:
+ n = dns.name.from_text(t)
+ except:
+ self.fail("good test '%s' raised an exception" % t)
+ for t in bad:
+ caught = False
+ try:
+ n = dns.name.from_text(t)
+ except:
+ caught = True
+ if not caught:
+ self.fail("bad test '%s' did not raise an exception" % t)
+
def testImmutable1(self):
def bad():
self.origin.labels = ()
@@ -238,7 +278,7 @@ class NameTestCase(unittest.TestCase):
n = dns.name.Name(['a' * 63, 'a' * 63, 'a' * 63, 'a' * 62])
self.failUnless(n)
- def testLabelTooLong(self):
+ def testNameTooLong(self):
def bad():
n = dns.name.Name(['a' * 63, 'a' * 63, 'a' * 63, 'a' * 63])
self.failUnlessRaises(dns.name.NameTooLong, bad)