summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_cmd_line_script.py
diff options
context:
space:
mode:
authorRonald Oussoren <ronaldoussoren@mac.com>2022-11-27 10:56:14 (GMT)
committerGitHub <noreply@github.com>2022-11-27 10:56:14 (GMT)
commitd08fb257698e3475d6f69bb808211d39e344e5b2 (patch)
tree2337d2b5d1f350a78ac65136d399bf22773c49d8 /Lib/test/test_cmd_line_script.py
parent9c9f085e9a1d1464376ea421e5c96472ca11c3b4 (diff)
downloadcpython-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.py14
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()