]> granicus.if.org Git - python/commitdiff
Issue #21058: Fix a leak of file descriptor in tempfile.NamedTemporaryFile(),
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 25 Mar 2014 08:08:16 +0000 (09:08 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 25 Mar 2014 08:08:16 +0000 (09:08 +0100)
close the file descriptor if os.fdopen() fails

Lib/tempfile.py
Lib/test/test_tempfile.py
Misc/NEWS

index 7154d2c6b52141fbeb7d74e53433d57b738b29a4..94ad0b7ec7569bf54787556e9d2abee94d9e8349 100644 (file)
@@ -460,8 +460,12 @@ def NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
         flags |= _os.O_TEMPORARY
 
     (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
-    file = _os.fdopen(fd, mode, bufsize)
-    return _TemporaryFileWrapper(file, name, delete)
+    try:
+        file = _os.fdopen(fd, mode, bufsize)
+        return _TemporaryFileWrapper(file, name, delete)
+    except Exception:
+        _os.close(fd)
+        raise
 
 if _os.name != 'posix' or _os.sys.platform == 'cygwin':
     # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
index 40f70c0b30bf2351b8efc68d6f34282f29bf56a5..465bcdac0c422396069fdc8bf3babbca6beb1a64 100644 (file)
@@ -771,6 +771,24 @@ class test_NamedTemporaryFile(TC):
                 pass
         self.assertRaises(ValueError, use_closed)
 
+    def test_no_leak_fd(self):
+        # Issue #21058: don't leak file descriptor when fdopen() fails
+        old_close = os.close
+        old_fdopen = os.fdopen
+        closed = []
+        def close(fd):
+            closed.append(fd)
+        def fdopen(*args):
+            raise ValueError()
+        os.close = close
+        os.fdopen = fdopen
+        try:
+            self.assertRaises(ValueError, tempfile.NamedTemporaryFile)
+            self.assertEqual(len(closed), 1)
+        finally:
+            os.close = old_close
+            os.fdopen = old_fdopen
+
     # How to test the mode and bufsize parameters?
 
 test_classes.append(test_NamedTemporaryFile)
index e2c757c1621034424e795a90ab71077ee1896746..0f455557c216a1338b4da7dfadf1bfb112e4a9b3 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #21058: Fix a leak of file descriptor in tempfile.NamedTemporaryFile(),
+  close the file descriptor if os.fdopen() fails
+
 - Issue #20283: RE pattern methods now accept the string keyword parameters
   as documented.  The pattern and source keyword parameters are left as
   deprecated aliases.