Parcourir la source

[trac964] fixed the problem, with an additional test case.

JINMEI Tatuya il y a 14 ans
Parent
commit
9611300c4a

+ 8 - 6
src/lib/python/isc/notify/notify_out.py

@@ -21,6 +21,7 @@ import threading
 import time
 import errno
 from isc.datasrc import sqlite3_ds
+from isc.net import addr
 import isc
 try: 
     from pydnspp import * 
@@ -90,9 +91,9 @@ class ZoneNotifyInfo:
             self._sock = None
         self.notify_timeout = None
 
-    def create_socket(self, addrinfo):
-        # XXX we'll fix this
-        self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    def create_socket(self, dest_addr):
+        self._sock = socket.socket(addr.IPAddr(dest_addr).family,
+                                   socket.SOCK_DGRAM)
         return self._sock
 
     def get_socket(self):
@@ -392,12 +393,13 @@ class NotifyOut:
         render.set_length_limit(512) 
         msg.to_wire(render)
         zone_notify_info.notify_msg_id = qid
-        sock = zone_notify_info.create_socket(addrinfo)
         try:
+            sock = zone_notify_info.create_socket(addrinfo[0])
             sock.sendto(render.get_data(), 0, addrinfo)
             self._log_msg('info', 'sending notify to %s' % addr_to_str(addrinfo))
-        except socket.error as err:
-            self._log_msg('error', 'send notify to %s failed: %s' % (addr_to_str(addrinfo), str(err)))
+        except (socket.error, addr.InvalidAddress) as err:
+            self._log_msg('error', 'send notify to %s failed: %s' %
+                          (addr_to_str(addrinfo), str(err)))
             return False
 
         return True

+ 11 - 0
src/lib/python/isc/notify/tests/notify_out_test.py

@@ -257,6 +257,17 @@ class TestNotifyOut(unittest.TestCase):
         self.assertTrue(ret)
         self.assertEqual(socket.AF_INET6, example_com_info.sock_family)
 
+    def test_send_notify_message_with_bogus_address(self):
+        example_com_info = self._notify._notify_infos[('example.net.', 'IN')]
+
+        # As long as the underlying data source validates RDATA this shouldn't
+        # happen, but right now it's not actually the case.  Even if the
+        # data source does its job, it's prudent to confirm the behavior for
+        # an unexpected case.
+        ret = self._notify._send_notify_message_udp(example_com_info,
+                                                    ('invalid', 53))
+        self.assertFalse(ret)
+
     def test_zone_notify_handler(self):
         old_send_msg = self._notify._send_notify_message_udp
         def _fake_send_notify_message_udp(va1, va2):