]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
make address parsing stricter
authorBob Halley <halley@nominum.com>
Sat, 9 Jul 2011 00:50:10 +0000 (17:50 -0700)
committerBob Halley <halley@nominum.com>
Sat, 9 Jul 2011 00:50:10 +0000 (17:50 -0700)
ChangeLog
dns/ipv4.py
dns/ipv6.py

index 94eca92aa6e6e7ff295c96e6d3c496167b9ad9c3..08d93d83c398fb2db3a0bb756932f461f639cc2c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2011-07-08  Bob Halley  <halley@dnspython.org>
+
+       * dns/ipv4.py: dnspython now provides its own, stricter, versions
+         of IPv4 inet_ntoa() and inet_aton() instead of using the OS's
+         versions.
+
+       * dns/ipv6.py: inet_aton() now bounds checks embedded IPv4 addresses
+         more strictly.  Also, now only dns.exception.SyntaxError can be
+         raised on bad input.
+
 2011-04-05  Bob Halley  <halley@dnspython.org>
 
        * Old DNSSEC types (KEY, NXT, and SIG) have been removed.
index 8e5305a891243d4bb80ead6dbdc791330c854de9..1860ddcb0d160000c084421f5d2404b460c2c4c6 100644 (file)
 
 """IPv4 helper functions."""
 
-import socket
-import sys
+import struct
 
-if sys.platform == 'win32':
-    #
-    # XXX  Does the Win32 python 3 inet_aton still reject 255.255.255.255?
-    # Until we know it doesn't, we'll keep our workaround in place.
-    #
-    def inet_aton(text):
-        if text == '255.255.255.255':
-            return b'\xff' * 4
-        else:
-            return socket.inet_aton(text)
-else:
-    inet_aton = socket.inet_aton
+import dns.exception
 
-inet_ntoa = socket.inet_ntoa
+def inet_ntoa(address):
+    if len(address) != 4:
+        raise dns.exception.SyntaxError
+    return '%u.%u.%u.%u' % (address[0], address[1], address[2], address[3])
+
+def inet_aton(text):
+    parts = text.split('.')
+    if len(parts) != 4:
+        raise dns.exception.SyntaxError
+    try:
+        bytes = [int(part) for part in parts]
+        return struct.pack('BBBB', *bytes)
+    except:
+        raise dns.exception.SyntaxError
index fc53ec4dea1204c70f5b8e381e5d7dd827720145..4b9312b3e28f1240f5403c752c58ff564cd2c924 100644 (file)
@@ -108,9 +108,16 @@ def inet_aton(text):
     #
     m = _v4_ending.match(text)
     if not m is None:
-        text = "%s:%04x:%04x" % (m.group(1),
-                                 int(m.group(2)) * 256 + int(m.group(3)),
-                                 int(m.group(4)) * 256 + int(m.group(5)))
+        try:
+            b1 = int(m.group(2))
+            b2 = int(m.group(3))
+            b3 = int(m.group(4))
+            b4 = int(m.group(5))
+        except:
+            raise dns.exception.SyntaxError
+        if b1 > 255 or b2 > 255 or b3 > 255 or b4 > 255:
+            raise dns.exception.SyntaxError
+        text = "%s:%04x:%04x" % (m.group(1), b1 * 256 + b2, b3 * 256 + b4)
     #
     # Try to turn '::<whatever>' into ':<whatever>'; if no match try to
     # turn '<whatever>::' into '<whatever>:'