]> granicus.if.org Git - python/commitdiff
Issue #7943: Fix circular reference created when instantiating an SSL
authorAntoine Pitrou <solipsis@pitrou.net>
Fri, 23 Apr 2010 22:54:59 +0000 (22:54 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Fri, 23 Apr 2010 22:54:59 +0000 (22:54 +0000)
socket.  Initial patch by Péter Szabó.

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

index c960aaa76a79ddd01a4d9349889912b0158e2751..4f291f4486977eb59741508c25da81f3d19196e4 100644 (file)
@@ -75,7 +75,7 @@ from _ssl import \
      SSL_ERROR_EOF, \
      SSL_ERROR_INVALID_ERROR_CODE
 
-from socket import socket, _fileobject, error as socket_error
+from socket import socket, _fileobject, _delegate_methods, error as socket_error
 from socket import getnameinfo as _getnameinfo
 import base64        # for DER-to-PEM translation
 
@@ -91,13 +91,14 @@ class SSLSocket(socket):
                  do_handshake_on_connect=True,
                  suppress_ragged_eofs=True, ciphers=None):
         socket.__init__(self, _sock=sock._sock)
-        # the initializer for socket trashes the methods (tsk, tsk), so...
-        self.send = lambda data, flags=0: SSLSocket.send(self, data, flags)
-        self.sendto = lambda data, addr, flags=0: SSLSocket.sendto(self, data, addr, flags)
-        self.recv = lambda buflen=1024, flags=0: SSLSocket.recv(self, buflen, flags)
-        self.recvfrom = lambda addr, buflen=1024, flags=0: SSLSocket.recvfrom(self, addr, buflen, flags)
-        self.recv_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recv_into(self, buffer, nbytes, flags)
-        self.recvfrom_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recvfrom_into(self, buffer, nbytes, flags)
+        # The initializer for socket overrides the methods send(), recv(), etc.
+        # in the instancce, which we don't need -- but we want to provide the
+        # methods defined in SSLSocket.
+        for attr in _delegate_methods:
+            try:
+                delattr(self, attr)
+            except AttributeError:
+                pass
 
         if certfile and not keyfile:
             keyfile = certfile
index 458db269e5d9330057e5e2aa8609481e32526c03..5917b513df7e2f1e0a14264560ee405111a74297 100644 (file)
@@ -11,6 +11,7 @@ import os
 import pprint
 import urllib, urlparse
 import traceback
+import weakref
 
 from BaseHTTPServer import HTTPServer
 from SimpleHTTPServer import SimpleHTTPRequestHandler
@@ -154,6 +155,16 @@ class BasicTests(unittest.TestCase):
         with self.assertRaisesRegexp(ssl.SSLError, "No cipher can be selected"):
             s.connect(remote)
 
+    @test_support.cpython_only
+    def test_refcycle(self):
+        # Issue #7943: an SSL object doesn't create reference cycles with
+        # itself.
+        s = socket.socket(socket.AF_INET)
+        ss = ssl.wrap_socket(s)
+        wr = weakref.ref(ss)
+        del ss
+        self.assertEqual(wr(), None)
+
 
 class NetworkedTests(unittest.TestCase):
 
index cd74072b1ad4eb35b14696f378920f8ac0be1904..cb827da1e21179af5617d52913e1bc8104fd4f45 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -743,6 +743,7 @@ Andrew Svetlov
 Kalle Svensson
 Paul Swartz
 Thenault Sylvain
+Péter Szabó
 Arfrever Frehtes Taifersar Arahesis
 Geoff Talvola
 William Tanksley
index 6be66b35bb3f457dec31f014f634046ce90c3ece..26ce4e051f36af64da930179035c4d93bc5e86af 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -25,6 +25,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #7943: Fix circular reference created when instantiating an SSL
+  socket.  Initial patch by Péter Szabó.
+
 - Issue #8451: Syslog module now uses basename(sys.argv[0]) instead of
   the string "python" as the *ident*.  openlog() arguments are all optional
   and keywords.