[Python-checkins] gh-90473: wasmtime does not support absolute symlinks (GH-93490)

miss-islington webhook-mailer at python.org
Sun Jun 5 04:26:59 EDT 2022


https://github.com/python/cpython/commit/a8bd502e575e2b9f60660425e6458477445c93d5
commit: a8bd502e575e2b9f60660425e6458477445c93d5
branch: 3.11
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-06-05T01:26:38-07:00
summary:

gh-90473: wasmtime does not support absolute symlinks (GH-93490)

(cherry picked from commit 6f8367d3489eff07139bc908fdf666fc904ca445)

Co-authored-by: Christian Heimes <christian at python.org>

files:
A Misc/NEWS.d/next/Tests/2022-06-03-14-18-37.gh-issue-90473.7iXVRK.rst
A Misc/NEWS.d/next/Tests/2022-06-04-12-05-31.gh-issue-90473.RSpjF7.rst
M Lib/test/support/os_helper.py
M Lib/test/test_posixpath.py
M Lib/test/test_stat.py

diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py
index ed4ec15c7cbe9..5d787f16b69dd 100644
--- a/Lib/test/support/os_helper.py
+++ b/Lib/test/support/os_helper.py
@@ -171,9 +171,13 @@ def can_symlink():
     global _can_symlink
     if _can_symlink is not None:
         return _can_symlink
-    symlink_path = TESTFN + "can_symlink"
+    # WASI / wasmtime prevents symlinks with absolute paths, see man
+    # openat2(2) RESOLVE_BENEATH. Almost all symlink tests use absolute
+    # paths. Skip symlink tests on WASI for now.
+    src = os.path.abspath(TESTFN)
+    symlink_path = src + "can_symlink"
     try:
-        os.symlink(TESTFN, symlink_path)
+        os.symlink(src, symlink_path)
         can = True
     except (OSError, NotImplementedError, AttributeError):
         can = False
diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py
index 5fc4205beb125..97d3e9ea15bf3 100644
--- a/Lib/test/test_posixpath.py
+++ b/Lib/test/test_posixpath.py
@@ -387,8 +387,7 @@ def test_realpath_pardir(self):
         self.assertEqual(realpath(b'../..'), dirname(dirname(os.getcwdb())))
         self.assertEqual(realpath(b'/'.join([b'..'] * 100)), b'/')
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_basic(self):
         # Basic operation.
@@ -398,8 +397,7 @@ def test_realpath_basic(self):
         finally:
             os_helper.unlink(ABSTFN)
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_strict(self):
         # Bug #43757: raise FileNotFoundError in strict mode if we encounter
@@ -411,8 +409,7 @@ def test_realpath_strict(self):
         finally:
             os_helper.unlink(ABSTFN)
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_relative(self):
         try:
@@ -421,8 +418,7 @@ def test_realpath_relative(self):
         finally:
             os_helper.unlink(ABSTFN)
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_symlink_loops(self):
         # Bug #930024, return the path unchanged if we get into an infinite
@@ -463,8 +459,7 @@ def test_realpath_symlink_loops(self):
             os_helper.unlink(ABSTFN+"c")
             os_helper.unlink(ABSTFN+"a")
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_symlink_loops_strict(self):
         # Bug #43757, raise OSError if we get into an infinite symlink loop in
@@ -505,8 +500,7 @@ def test_realpath_symlink_loops_strict(self):
             os_helper.unlink(ABSTFN+"c")
             os_helper.unlink(ABSTFN+"a")
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_repeated_indirect_symlinks(self):
         # Issue #6975.
@@ -520,8 +514,7 @@ def test_realpath_repeated_indirect_symlinks(self):
             os_helper.unlink(ABSTFN + '/link')
             safe_rmdir(ABSTFN)
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_deep_recursion(self):
         depth = 10
@@ -540,8 +533,7 @@ def test_realpath_deep_recursion(self):
                 os_helper.unlink(ABSTFN + '/%d' % i)
             safe_rmdir(ABSTFN)
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_resolve_parents(self):
         # We also need to resolve any symlinks in the parents of a relative
@@ -560,8 +552,7 @@ def test_realpath_resolve_parents(self):
             safe_rmdir(ABSTFN + "/y")
             safe_rmdir(ABSTFN)
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_resolve_before_normalizing(self):
         # Bug #990669: Symbolic links should be resolved before we
@@ -589,8 +580,7 @@ def test_realpath_resolve_before_normalizing(self):
             safe_rmdir(ABSTFN + "/k")
             safe_rmdir(ABSTFN)
 
-    @unittest.skipUnless(hasattr(os, "symlink"),
-                         "Missing symlink implementation")
+    @os_helper.skip_unless_symlink
     @skip_if_ABSTFN_contains_backslash
     def test_realpath_resolve_first(self):
         # Bug #1213894: The first component of the path, if not absolute,
diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py
index 2e1e2c349c8d0..193a0fc15d9bc 100644
--- a/Lib/test/test_stat.py
+++ b/Lib/test/test_stat.py
@@ -161,7 +161,7 @@ def test_directory(self):
         else:
             self.assertEqual(modestr[0], 'd')
 
-    @unittest.skipUnless(hasattr(os, 'symlink'), 'os.symlink not available')
+    @os_helper.skip_unless_symlink
     def test_link(self):
         try:
             os.symlink(os.getcwd(), TESTFN)
diff --git a/Misc/NEWS.d/next/Tests/2022-06-03-14-18-37.gh-issue-90473.7iXVRK.rst b/Misc/NEWS.d/next/Tests/2022-06-03-14-18-37.gh-issue-90473.7iXVRK.rst
new file mode 100644
index 0000000000000..a3165a01111fb
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2022-06-03-14-18-37.gh-issue-90473.7iXVRK.rst
@@ -0,0 +1,2 @@
+Skip symlink tests on WASI. wasmtime uses ``openat2(2)`` with
+``RESOLVE_BENEATH`` flag, which prevents symlinks with absolute paths.
diff --git a/Misc/NEWS.d/next/Tests/2022-06-04-12-05-31.gh-issue-90473.RSpjF7.rst b/Misc/NEWS.d/next/Tests/2022-06-04-12-05-31.gh-issue-90473.RSpjF7.rst
new file mode 100644
index 0000000000000..07d579995c091
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2022-06-04-12-05-31.gh-issue-90473.RSpjF7.rst
@@ -0,0 +1 @@
+Skip tests on WASI that require symlinks with absolute paths.



More information about the Python-checkins mailing list