diff options
author | Ronald Oussoren <ronaldoussoren@mac.com> | 2022-11-27 10:56:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-27 10:56:14 (GMT) |
commit | d08fb257698e3475d6f69bb808211d39e344e5b2 (patch) | |
tree | 2337d2b5d1f350a78ac65136d399bf22773c49d8 /Lib/test/test_cmd_line_script.py | |
parent | 9c9f085e9a1d1464376ea421e5c96472ca11c3b4 (diff) | |
download | cpython-d08fb257698e3475d6f69bb808211d39e344e5b2.zip cpython-d08fb257698e3475d6f69bb808211d39e344e5b2.tar.gz cpython-d08fb257698e3475d6f69bb808211d39e344e5b2.tar.bz2 |
GH-87235: Make sure "python /dev/fd/9 9</path/to/script.py" works on macOS (#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.
Diffstat (limited to 'Lib/test/test_cmd_line_script.py')
-rw-r--r-- | Lib/test/test_cmd_line_script.py | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 1ee3acd..c838e95 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -752,6 +752,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() |