From 0f0850f738425fda85b21e04cb72f7ca6f2923c0 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 24 Feb 2015 19:49:23 +0100 Subject: [PATCH] fix unicode ipaddr crashes in rdata.from_text and tokenizer.Tokenizer, fixes #41 also added unit tests for both issues. --- dns/rdata.py | 2 +- dns/tokenizer.py | 2 +- tests/test_rdata.py | 33 +++++++++++++++++++++++++++++++++ tests/test_tokenizer.py | 10 ++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 tests/test_rdata.py diff --git a/dns/rdata.py b/dns/rdata.py index 3a31ae1c..ef0dddef 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 ab568731..6a489756 100644 --- a/dns/tokenizer.py +++ b/dns/tokenizer.py @@ -197,7 +197,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 = '' diff --git a/tests/test_rdata.py b/tests/test_rdata.py new file mode 100644 index 00000000..69e64e16 --- /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 1d561ae1..d75de3b1 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() -- 2.47.3