Merged revisions 80428 via svnmerge from

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

........
  r80428 | antoine.pitrou | 2010-04-24 01:25:45 +0200 (sam., 24 avril 2010) | 4 lines

  Issue #5238: Calling makefile() on an SSL object would prevent the
  underlying socket from being closed until all objects get truely destroyed.
........
This commit is contained in:
Antoine Pitrou 2010-04-23 23:35:01 +00:00
parent 3df58d11be
commit d4030dacc6
3 changed files with 28 additions and 1 deletions

View File

@ -320,7 +320,9 @@ class SSLSocket(socket):
from the socket module.""" from the socket module."""
self._makefile_refs += 1 self._makefile_refs += 1
return _fileobject(self, mode, bufsize) # close=True so as to decrement the reference count when done with
# the file-like object.
return _fileobject(self, mode, bufsize, close=True)

View File

@ -9,7 +9,9 @@ import select
import errno import errno
import subprocess import subprocess
import time import time
import gc
import os import os
import errno
import pprint import pprint
import urllib, urlparse import urllib, urlparse
import shutil import shutil
@ -123,6 +125,26 @@ class BasicTests(unittest.TestCase):
del ss del ss
self.assertEqual(wr(), None) self.assertEqual(wr(), None)
def test_makefile_close(self):
# Issue #5238: creating a file-like object with makefile() shouldn't
# leak the underlying file descriptor.
ss = ssl.wrap_socket(socket.socket(socket.AF_INET))
fd = ss.fileno()
f = ss.makefile()
f.close()
# The fd is still open
os.read(fd, 0)
# Closing the SSL socket should close the fd too
ss.close()
gc.collect()
try:
os.read(fd, 0)
except OSError, e:
self.assertEqual(e.errno, errno.EBADF)
else:
self.fail("OSError wasn't raised")
class NetworkedTests(unittest.TestCase): class NetworkedTests(unittest.TestCase):
def testConnect(self): def testConnect(self):

View File

@ -33,6 +33,9 @@ Core and Builtins
Library Library
------- -------
- Issue #5238: Calling makefile() on an SSL object would prevent the
underlying socket from being closed until all objects get truely destroyed.
- Issue #7943: Fix circular reference created when instantiating an SSL - Issue #7943: Fix circular reference created when instantiating an SSL
socket. Initial patch by Péter Szabó. socket. Initial patch by Péter Szabó.