]> granicus.if.org Git - python/commitdiff
Issue #9729: Fix the signature of SSLSocket.recvfrom() and
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 14 Sep 2010 14:37:18 +0000 (14:37 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 14 Sep 2010 14:37:18 +0000 (14:37 +0000)
SSLSocket.sendto() to match the corresponding socket methods.  Also,
fix various SSLSocket methods to raise socket.error rather than an
unhelpful TypeError when called on an unconnected socket.  Original patch
by Andrew Bennetts.

NOTE: obviously, these methods are untested and unused in the real world...

Lib/ssl.py
Lib/test/test_ssl.py
Misc/NEWS

index 96b628158537be723683a633db4f18b2708e4182..8c2cdf1bb41374b89fe89fa2bb26e9fc67f74509 100644 (file)
@@ -184,14 +184,16 @@ class SSLSocket(socket):
                 else:
                     return v
         else:
-            return socket.send(self, data, flags)
+            return self._sock.send(data, flags)
 
-    def sendto(self, data, addr, flags=0):
+    def sendto(self, data, flags_or_addr, addr=None):
         if self._sslobj:
             raise ValueError("sendto not allowed on instances of %s" %
                              self.__class__)
+        elif addr is None:
+            return self._sock.sendto(data, flags_or_addr)
         else:
-            return socket.sendto(self, data, addr, flags)
+            return self._sock.sendto(data, flags_or_addr, addr)
 
     def sendall(self, data, flags=0):
         if self._sslobj:
@@ -216,7 +218,7 @@ class SSLSocket(socket):
                     self.__class__)
             return self.read(buflen)
         else:
-            return socket.recv(self, buflen, flags)
+            return self._sock.recv(buflen, flags)
 
     def recv_into(self, buffer, nbytes=None, flags=0):
         if buffer and (nbytes is None):
@@ -233,21 +235,21 @@ class SSLSocket(socket):
             buffer[:v] = tmp_buffer
             return v
         else:
-            return socket.recv_into(self, buffer, nbytes, flags)
+            return self._sock.recv_into(buffer, nbytes, flags)
 
-    def recvfrom(self, addr, buflen=1024, flags=0):
+    def recvfrom(self, buflen=1024, flags=0):
         if self._sslobj:
             raise ValueError("recvfrom not allowed on instances of %s" %
                              self.__class__)
         else:
-            return socket.recvfrom(self, addr, buflen, flags)
+            return self._sock.recvfrom(buflen, flags)
 
     def recvfrom_into(self, buffer, nbytes=None, flags=0):
         if self._sslobj:
             raise ValueError("recvfrom_into not allowed on instances of %s" %
                              self.__class__)
         else:
-            return socket.recvfrom_into(self, buffer, nbytes, flags)
+            return self._sock.recvfrom_into(buffer, nbytes, flags)
 
     def pending(self):
         if self._sslobj:
index d6f1fce7a771b2568eae516db906d1a2e91a6365..37261554bc47e6837f602d661b221d3863eaa981 100644 (file)
@@ -179,6 +179,19 @@ class BasicSocketTests(unittest.TestCase):
         del ss
         self.assertEqual(wr(), None)
 
+    def test_wrapped_unconnected(self):
+        # The _delegate_methods in socket.py are correctly delegated to by an
+        # unconnected SSLSocket, so they will raise a socket.error rather than
+        # something unexpected like TypeError.
+        s = socket.socket(socket.AF_INET)
+        ss = ssl.wrap_socket(s)
+        self.assertRaises(socket.error, ss.recv, 1)
+        self.assertRaises(socket.error, ss.recv_into, bytearray(b'x'))
+        self.assertRaises(socket.error, ss.recvfrom, 1)
+        self.assertRaises(socket.error, ss.recvfrom_into, bytearray(b'x'), 1)
+        self.assertRaises(socket.error, ss.send, b'x')
+        self.assertRaises(socket.error, ss.sendto, b'x', ('0.0.0.0', 0))
+
 
 class NetworkedTests(unittest.TestCase):
 
index 657e99114894b4a3f7f7ded7ab7a2e385181c01b..2b97d633e8e13e6382a7c27ae6fef41689a903f6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -43,6 +43,12 @@ Core and Builtins
 Library
 -------
 
+- Issue #9729: Fix the signature of SSLSocket.recvfrom() and
+  SSLSocket.sendto() to match the corresponding socket methods.  Also,
+  fix various SSLSocket methods to raise socket.error rather than an
+  unhelpful TypeError when called on an unconnected socket.  Original patch
+  by Andrew Bennetts.
+
 - Issue #9826: OrderedDict.__repr__ can now handle self-referential
   values:   d['x'] = d.