Merged revisions 80423 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r80423 | antoine.pitrou | 2010-04-24 00:54:59 +0200 (sam., 24 avril 2010) | 4 lines

  Issue #7943: Fix circular reference created when instantiating an SSL
  socket.  Initial patch by Péter Szabó.
........
This commit is contained in:
Antoine Pitrou 2010-04-23 23:07:37 +00:00
parent 07072168fb
commit 3df58d11be
4 changed files with 23 additions and 8 deletions

View File

@ -74,7 +74,7 @@ from _ssl import \
SSL_ERROR_EOF, \ SSL_ERROR_EOF, \
SSL_ERROR_INVALID_ERROR_CODE SSL_ERROR_INVALID_ERROR_CODE
from socket import socket, _fileobject from socket import socket, _fileobject, _delegate_methods
from socket import getnameinfo as _getnameinfo from socket import getnameinfo as _getnameinfo
import base64 # for DER-to-PEM translation import base64 # for DER-to-PEM translation
@ -90,13 +90,14 @@ class SSLSocket(socket):
do_handshake_on_connect=True, do_handshake_on_connect=True,
suppress_ragged_eofs=True): suppress_ragged_eofs=True):
socket.__init__(self, _sock=sock._sock) socket.__init__(self, _sock=sock._sock)
# the initializer for socket trashes the methods (tsk, tsk), so... # The initializer for socket overrides the methods send(), recv(), etc.
self.send = lambda data, flags=0: SSLSocket.send(self, data, flags) # in the instancce, which we don't need -- but we want to provide the
self.sendto = lambda data, addr, flags=0: SSLSocket.sendto(self, data, addr, flags) # methods defined in SSLSocket.
self.recv = lambda buflen=1024, flags=0: SSLSocket.recv(self, buflen, flags) for attr in _delegate_methods:
self.recvfrom = lambda addr, buflen=1024, flags=0: SSLSocket.recvfrom(self, addr, buflen, flags) try:
self.recv_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recv_into(self, buffer, nbytes, flags) delattr(self, attr)
self.recvfrom_into = lambda buffer, nbytes=None, flags=0: SSLSocket.recvfrom_into(self, buffer, nbytes, flags) except AttributeError:
pass
if certfile and not keyfile: if certfile and not keyfile:
keyfile = certfile keyfile = certfile

View File

@ -14,6 +14,7 @@ import pprint
import urllib, urlparse import urllib, urlparse
import shutil import shutil
import traceback import traceback
import weakref
from BaseHTTPServer import HTTPServer from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler from SimpleHTTPServer import SimpleHTTPRequestHandler
@ -113,6 +114,15 @@ class BasicTests(unittest.TestCase):
if (d1 != d2): if (d1 != d2):
raise test_support.TestFailed("PEM-to-DER or DER-to-PEM translation failed") raise test_support.TestFailed("PEM-to-DER or DER-to-PEM translation failed")
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): class NetworkedTests(unittest.TestCase):
def testConnect(self): def testConnect(self):

View File

@ -701,6 +701,7 @@ Andrew Svetlov
Kalle Svensson Kalle Svensson
Paul Swartz Paul Swartz
Thenault Sylvain Thenault Sylvain
Péter Szabó
Arfrever Frehtes Taifersar Arahesis Arfrever Frehtes Taifersar Arahesis
Geoff Talvola Geoff Talvola
William Tanksley William Tanksley

View File

@ -33,6 +33,9 @@ Core and Builtins
Library Library
------- -------
- Issue #7943: Fix circular reference created when instantiating an SSL
socket. Initial patch by Péter Szabó.
- Issue #8108: Fix the unwrap() method of SSL objects when the socket has - Issue #8108: Fix the unwrap() method of SSL objects when the socket has
a non-infinite timeout. Also make that method friendlier with applications a non-infinite timeout. Also make that method friendlier with applications
wanting to continue using the socket in clear-text mode, by disabling wanting to continue using the socket in clear-text mode, by disabling