From 1c40a4b975533e9988d9173d073ff3629a551d32 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Mon, 6 Jun 2022 10:16:41 +0200 Subject: [PATCH] gh-90473: WASI requires proper open(2) flags --- Lib/test/support/os_helper.py | 5 ++++- Lib/test/test_os.py | 3 ++- Tools/wasm/README.md | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py index 5d787f16b69dd2..a6ec1cfa25ebe0 100644 --- a/Lib/test/support/os_helper.py +++ b/Lib/test/support/os_helper.py @@ -463,7 +463,10 @@ def create_empty_file(filename): def open_dir_fd(path): """Open a file descriptor to a directory.""" assert os.path.isdir(path) - dir_fd = os.open(path, os.O_RDONLY) + flags = os.O_RDONLY + if hasattr(os, "O_DIRECTORY"): + flags |= os.O_DIRECTORY + dir_fd = os.open(path, flags) try: yield dir_fd finally: diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index f304c5e01e5fa1..c0321dcdcc071a 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3993,7 +3993,7 @@ class PathTConverterTests(unittest.TestCase): ('access', False, (os.F_OK,), None), ('chflags', False, (0,), None), ('lchflags', False, (0,), None), - ('open', False, (0,), getattr(os, 'close', None)), + ('open', False, (os.O_RDONLY,), getattr(os, 'close', None)), ] def test_path_t_converter(self): @@ -4365,6 +4365,7 @@ def test_fd(self): st = os.stat(entry.name, dir_fd=fd, follow_symlinks=False) self.assertEqual(entry.stat(follow_symlinks=False), st) + @unittest.skipIf(support.is_wasi, "WASI maps '' to cwd") def test_empty_path(self): self.assertRaises(FileNotFoundError, os.scandir, '') diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 6bb9bd9978402b..3b7a7aecc33eae 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -235,6 +235,9 @@ are: call read/write/accept on a file descriptor that is passed into the process. - ``socket.gethostname()`` and host name resolution APIs like ``socket.gethostbyname()`` are not implemented and always fail. +- ``open(2)`` checks flags more strictly. Caller must pass either + ``O_RDONLY``, ``O_RDWR``, or ``O_WDONLY`` to ``os.open``. Directory file + descriptors must be created with flags ``O_RDONLY | O_DIRECTORY``. - ``chmod(2)`` is not available. It's not possible to modify file permissions, yet. A future version of WASI may provide a limited ``set_permissions`` API. - User/group related features like ``os.chown()``, ``os.getuid``, etc. are