[Python-checkins] r84806 - in python/branches/release27-maint: Lib/ssl.py Lib/test/test_ssl.py Misc/NEWS

antoine.pitrou python-checkins at python.org
Tue Sep 14 16:37:18 CEST 2010


Author: antoine.pitrou
Date: Tue Sep 14 16:37:18 2010
New Revision: 84806

Log:
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.

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



Modified:
   python/branches/release27-maint/Lib/ssl.py
   python/branches/release27-maint/Lib/test/test_ssl.py
   python/branches/release27-maint/Misc/NEWS

Modified: python/branches/release27-maint/Lib/ssl.py
==============================================================================
--- python/branches/release27-maint/Lib/ssl.py	(original)
+++ python/branches/release27-maint/Lib/ssl.py	Tue Sep 14 16:37:18 2010
@@ -184,14 +184,16 @@
                 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 @@
                     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 @@
             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:

Modified: python/branches/release27-maint/Lib/test/test_ssl.py
==============================================================================
--- python/branches/release27-maint/Lib/test/test_ssl.py	(original)
+++ python/branches/release27-maint/Lib/test/test_ssl.py	Tue Sep 14 16:37:18 2010
@@ -179,6 +179,19 @@
         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):
 

Modified: python/branches/release27-maint/Misc/NEWS
==============================================================================
--- python/branches/release27-maint/Misc/NEWS	(original)
+++ python/branches/release27-maint/Misc/NEWS	Tue Sep 14 16:37:18 2010
@@ -43,6 +43,12 @@
 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.
 


More information about the Python-checkins mailing list