mirror of
https://github.com/python/cpython.git
synced 2025-07-12 05:45:15 +00:00
GH-87235: Make sure "python /dev/fd/9 9</path/to/script.py" works on macOS (GH-99768)
On macOS all file descriptors for a particular file in /dev/fd
share the same file offset, that is ``open("/dev/fd/9", "r")`` behaves
more like ``dup(9)`` than a regular open.
This causes problems when a user tries to run "/dev/fd/9" as a script
because zipimport changes the file offset to try to read a zipfile
directory. Therefore change zipimport to reset the file offset after
trying to read the zipfile directory.
(cherry picked from commit d08fb25769
)
Co-authored-by: Ronald Oussoren <ronaldoussoren@mac.com>
This commit is contained in:
parent
8bb7fdaee8
commit
e4cfdaa45b
3 changed files with 123 additions and 101 deletions
|
@ -740,6 +740,20 @@ class CmdLineTest(unittest.TestCase):
|
|||
self.assertIn(": can't open file ", err)
|
||||
self.assertNotEqual(proc.returncode, 0)
|
||||
|
||||
@unittest.skipUnless(os.path.exists('/dev/fd/0'), 'requires /dev/fd platform')
|
||||
def test_script_as_dev_fd(self):
|
||||
# GH-87235: On macOS passing a non-trivial script to /dev/fd/N can cause
|
||||
# problems because all open /dev/fd/N file descriptors share the same
|
||||
# offset.
|
||||
script = 'print("12345678912345678912345")'
|
||||
with os_helper.temp_dir() as work_dir:
|
||||
script_name = _make_test_script(work_dir, 'script.py', script)
|
||||
with open(script_name, "r") as fp:
|
||||
p = spawn_python(f"/dev/fd/{fp.fileno()}", close_fds=False, pass_fds=(0,1,2,fp.fileno()))
|
||||
out, err = p.communicate()
|
||||
self.assertEqual(out, b"12345678912345678912345\n")
|
||||
|
||||
|
||||
|
||||
def tearDownModule():
|
||||
support.reap_children()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue