mirror of
https://github.com/python/cpython.git
synced 2025-10-19 16:03:42 +00:00
gh-136156: Allow using linkat() with TemporaryFile (#136281)
tempfile.TemporaryFile() no longer uses os.O_EXCL with os.O_TMPFILE, so it's possible to use linkat() on the file descriptor.
This commit is contained in:
parent
490eea0281
commit
6c81e8c57a
3 changed files with 27 additions and 1 deletions
|
@ -656,7 +656,7 @@ def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
|
||||||
fd = None
|
fd = None
|
||||||
def opener(*args):
|
def opener(*args):
|
||||||
nonlocal fd
|
nonlocal fd
|
||||||
flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
|
flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT & ~_os.O_EXCL
|
||||||
fd = _os.open(dir, flags2, 0o600)
|
fd = _os.open(dir, flags2, 0o600)
|
||||||
return fd
|
return fd
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1594,6 +1594,29 @@ def test_unexpected_error(self):
|
||||||
mock_close.assert_called()
|
mock_close.assert_called()
|
||||||
self.assertEqual(os.listdir(dir), [])
|
self.assertEqual(os.listdir(dir), [])
|
||||||
|
|
||||||
|
@unittest.skipUnless(tempfile._O_TMPFILE_WORKS, 'need os.O_TMPFILE')
|
||||||
|
@unittest.skipUnless(os.path.exists('/proc/self/fd'),
|
||||||
|
'need /proc/self/fd')
|
||||||
|
def test_link_tmpfile(self):
|
||||||
|
dir = tempfile.mkdtemp()
|
||||||
|
self.addCleanup(os_helper.rmtree, dir)
|
||||||
|
filename = os.path.join(dir, "link")
|
||||||
|
|
||||||
|
with tempfile.TemporaryFile('w', dir=dir) as tmp:
|
||||||
|
# the flag can become False on Linux <= 3.11
|
||||||
|
if not tempfile._O_TMPFILE_WORKS:
|
||||||
|
self.skipTest("O_TMPFILE doesn't work")
|
||||||
|
|
||||||
|
tmp.write("hello")
|
||||||
|
tmp.flush()
|
||||||
|
fd = tmp.fileno()
|
||||||
|
|
||||||
|
os.link(f'/proc/self/fd/{fd}',
|
||||||
|
filename,
|
||||||
|
follow_symlinks=True)
|
||||||
|
with open(filename) as fp:
|
||||||
|
self.assertEqual(fp.read(), "hello")
|
||||||
|
|
||||||
|
|
||||||
# Helper for test_del_on_shutdown
|
# Helper for test_del_on_shutdown
|
||||||
class NulledModules:
|
class NulledModules:
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
:func:`tempfile.TemporaryFile` no longer uses :data:`os.O_EXCL` with
|
||||||
|
:data:`os.O_TMPFILE`, so it's possible to use ``linkat()`` on the file
|
||||||
|
descriptor. Patch by Victor Stinner.
|
Loading…
Add table
Add a link
Reference in a new issue