[pypy-commit] pypy default: Issue #2409: don't leak the file descriptor when doing "open('some-dir')"
arigo
pypy.commits at gmail.com
Sun Oct 2 15:57:02 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r87526:e696492591c7
Date: 2016-10-02 21:56 +0200
http://bitbucket.org/pypy/pypy/changeset/e696492591c7/
Log: Issue #2409: don't leak the file descriptor when doing "open('some-
dir')"
diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py
--- a/pypy/module/_file/interp_file.py
+++ b/pypy/module/_file/interp_file.py
@@ -140,7 +140,11 @@
stream = dispatch_filename(streamio.open_file_as_stream)(
self.space, w_name, mode, buffering, signal_checker(self.space))
fd = stream.try_to_find_file_descriptor()
- self.check_not_dir(fd)
+ try:
+ self.check_not_dir(fd)
+ except:
+ stream.close()
+ raise
self.fdopenstream(stream, fd, mode)
def direct___enter__(self):
diff --git a/pypy/module/_file/test/test_file_extra.py b/pypy/module/_file/test/test_file_extra.py
--- a/pypy/module/_file/test/test_file_extra.py
+++ b/pypy/module/_file/test/test_file_extra.py
@@ -667,3 +667,20 @@
f2.close()
s2.close()
s1.close()
+
+ def test_close_fd_if_dir_check_fails(self):
+ from errno import EMFILE
+ for i in range(1700):
+ try:
+ open('/')
+ except IOError as e:
+ assert e.errno != EMFILE
+ else:
+ assert False
+
+ @py.test.mark.skipif("os.name != 'posix'")
+ def test_dont_close_fd_if_dir_check_fails_in_fdopen(self):
+ import posix
+ fd = posix.open('/', posix.O_RDONLY)
+ raises(IOError, posix.fdopen, fd)
+ posix.close(fd)
More information about the pypy-commit
mailing list