summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Halley <halley@play-bow.org>2015-02-26 05:53:07 -0800
committerBob Halley <halley@play-bow.org>2015-02-26 05:53:07 -0800
commit335aaeeb10b2a1f49d0f3df6c3ba025b82edc2dd (patch)
treebffc94cf8034ad1ae39f6a355a7b4c88babd4889
parentae423039dbac7f5a6463da6484435b05a448dc83 (diff)
parent0f0850f738425fda85b21e04cb72f7ca6f2923c0 (diff)
downloaddnspython-335aaeeb10b2a1f49d0f3df6c3ba025b82edc2dd.tar.gz
Merge pull request #87 from ThomasWaldmann/master
fix unicode ipaddr crashes in rdata.from_text and tokenizer.Tokenizer
-rw-r--r--dns/rdata.py2
-rw-r--r--dns/tokenizer.py2
-rw-r--r--tests/test_rdata.py33
-rw-r--r--tests/test_tokenizer.py10
4 files changed, 45 insertions, 2 deletions
diff --git a/dns/rdata.py b/dns/rdata.py
index 3a31ae1..ef0ddde 100644
--- a/dns/rdata.py
+++ b/dns/rdata.py
@@ -412,7 +412,7 @@ def from_text(rdclass, rdtype, tok, origin = None, relativize = True):
@type relativize: bool
@rtype: dns.rdata.Rdata instance"""
- if isinstance(tok, str):
+ if isinstance(tok, (str, unicode)):
tok = dns.tokenizer.Tokenizer(tok)
cls = get_rdata_class(rdclass, rdtype)
if cls != GenericRdata:
diff --git a/dns/tokenizer.py b/dns/tokenizer.py
index f1faa72..b046f2b 100644
--- a/dns/tokenizer.py
+++ b/dns/tokenizer.py
@@ -195,7 +195,7 @@ class Tokenizer(object):
@type filename: string
"""
- if isinstance(f, str):
+ if isinstance(f, (str, unicode)):
f = cStringIO.StringIO(f)
if filename is None:
filename = '<string>'
diff --git a/tests/test_rdata.py b/tests/test_rdata.py
new file mode 100644
index 0000000..69e64e1
--- /dev/null
+++ b/tests/test_rdata.py
@@ -0,0 +1,33 @@
+# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose with or without fee is hereby granted,
+# provided that the above copyright notice and this permission notice
+# appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+import unittest
+
+import dns.rdata
+import dns.rdataclass
+import dns.rdatatype
+
+class RdataTestCase(unittest.TestCase):
+
+ def test_str(self):
+ rdata = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, "1.2.3.4")
+ self.failUnless(rdata.address == "1.2.3.4")
+
+ def test_unicode(self):
+ rdata = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, u"1.2.3.4")
+ self.failUnless(rdata.address == "1.2.3.4")
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/test_tokenizer.py b/tests/test_tokenizer.py
index 1d561ae..d75de3b 100644
--- a/tests/test_tokenizer.py
+++ b/tests/test_tokenizer.py
@@ -22,6 +22,16 @@ Token = dns.tokenizer.Token
class TokenizerTestCase(unittest.TestCase):
+ def testStr(self):
+ tok = dns.tokenizer.Tokenizer('foo')
+ token = tok.get()
+ self.failUnless(token == Token(dns.tokenizer.IDENTIFIER, 'foo'))
+
+ def testUnicode(self):
+ tok = dns.tokenizer.Tokenizer(u'foo')
+ token = tok.get()
+ self.failUnless(token == Token(dns.tokenizer.IDENTIFIER, 'foo'))
+
def testQuotedString1(self):
tok = dns.tokenizer.Tokenizer(r'"foo"')
token = tok.get()