Commit b558f17b authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #5238: Calling makefile() on an SSL object would prevent the

underlying socket from being closed until all objects get truely destroyed.
parent dfb299bb
...@@ -324,7 +324,9 @@ class SSLSocket(socket): ...@@ -324,7 +324,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)
......
...@@ -7,7 +7,9 @@ import asyncore ...@@ -7,7 +7,9 @@ import asyncore
import socket import socket
import select import select
import time import time
import gc
import os import os
import errno
import pprint import pprint
import urllib, urlparse import urllib, urlparse
import traceback import traceback
...@@ -165,6 +167,22 @@ class BasicTests(unittest.TestCase): ...@@ -165,6 +167,22 @@ 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()
with self.assertRaises(OSError) as e:
os.read(fd, 0)
self.assertEqual(e.exception.errno, errno.EBADF)
class NetworkedTests(unittest.TestCase): class NetworkedTests(unittest.TestCase):
......
...@@ -25,6 +25,9 @@ Core and Builtins ...@@ -25,6 +25,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ó.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment