Skip to content

Commit

Permalink
Issue #21515: tempfile.TemporaryFile now uses os.O_TMPFILE flag is av…
Browse files Browse the repository at this point in the history
…ailable
  • Loading branch information
vstinner committed Jun 5, 2014
1 parent 7088b99 commit d967fc9
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Doc/library/tempfile.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ The module defines the following user-callable items:
underlying true file object. This file-like object can be used in a
:keyword:`with` statement, just like a normal file.

The :py:data:`os.O_TMPFILE` flag is used if it is available and works
(Linux-specific, require Linux kernel 3.11 or later).

.. versionchanged:: 3.5

The :py:data:`os.O_TMPFILE` flag is now used if available.


.. function:: NamedTemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix='', prefix='tmp', dir=None, delete=True)

Expand Down
26 changes: 26 additions & 0 deletions Lib/tempfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,11 @@ def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
TemporaryFile = NamedTemporaryFile

else:
# Is the O_TMPFILE flag available and does it work?
# The flag is set to False if os.open(dir, os.O_TMPFILE) raises an
# IsADirectoryError exception
_O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE')

def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
newline=None, suffix="", prefix=template,
dir=None):
Expand All @@ -488,11 +493,32 @@ def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
Returns an object with a file-like interface. The file has no
name, and will cease to exist when it is closed.
"""
global _O_TMPFILE_WORKS

if dir is None:
dir = gettempdir()

flags = _bin_openflags
if _O_TMPFILE_WORKS:
try:
flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
fd = _os.open(dir, flags2, 0o600)
except IsADirectoryError:
# Linux kernel older than 3.11 ignores O_TMPFILE flag.
# Set flag to None to not try again.
_O_TMPFILE_WORKS = False
except OSError:
# The filesystem of the directory does not support O_TMPFILE.
# For example, OSError(95, 'Operation not supported').
pass
else:
try:
return _io.open(fd, mode, buffering=buffering,
newline=newline, encoding=encoding)
except:
_os.close(fd)
raise
# Fallback to _mkstemp_inner().

(fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
try:
Expand Down
2 changes: 2 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ Core and Builtins
Library
-------

- Issue #21515: tempfile.TemporaryFile now uses os.O_TMPFILE flag is available.

- Issue #21618: The subprocess module could fail to close open fds that were
inherited by the calling process and already higher than POSIX resource
limits would otherwise allow. On systems with a functioning /proc/self/fd
Expand Down

0 comments on commit d967fc9

Please sign in to comment.