]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-130397: remove special-casing of C stack depth for WASI (#134469)
authorBrett Cannon <brett@python.org>
Thu, 22 May 2025 21:08:44 +0000 (14:08 -0700)
committerGitHub <noreply@github.com>
Thu, 22 May 2025 21:08:44 +0000 (14:08 -0700)
Removed special-casing for WASI when setting C stack depth limits. Since WASI has its own C stack checking this isn't a security risk.

Also disabled some tests that stopped passing. They all happened to have already been disabled under Emscripten.

Include/pythonrun.h
Lib/test/test_copy.py
Lib/test/test_descr.py
Lib/test/test_exception_group.py
Lib/test/test_isinstance.py
Lib/test/test_json/test_recursion.py
Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst [new file with mode: 0644]
Python/ceval.c

index fad2b3c77476e41cc8c7099c412374abf9f2c1c0..716c4ab3c81caee43d7caff47f3c899e78dc4746 100644 (file)
@@ -29,9 +29,6 @@ PyAPI_DATA(int) (*PyOS_InputHook)(void);
 #  define PYOS_LOG2_STACK_MARGIN 12
 #elif defined(Py_DEBUG) && defined(WIN32)
 #  define PYOS_LOG2_STACK_MARGIN 12
-#elif defined(__wasi__)
-   /* Web assembly has two stacks, so this isn't really a size */
-#  define PYOS_LOG2_STACK_MARGIN 9
 #else
 #  define PYOS_LOG2_STACK_MARGIN 11
 #endif
index 3cb8072abefe9800c2b7e84a13a4a444e5a67d7c..467ec09d99e46213527b0e8010b241a257c810fd 100644 (file)
@@ -372,6 +372,7 @@ class TestCopy(unittest.TestCase):
         self.assertIsNot(x[0], y[0])
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_deepcopy_reflexive_list(self):
         x = []
         x.append(x)
@@ -400,6 +401,7 @@ class TestCopy(unittest.TestCase):
         self.assertIs(x, y)
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_deepcopy_reflexive_tuple(self):
         x = ([],)
         x[0].append(x)
@@ -418,6 +420,7 @@ class TestCopy(unittest.TestCase):
         self.assertIsNot(x["foo"], y["foo"])
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_deepcopy_reflexive_dict(self):
         x = {}
         x['foo'] = x
index d635855f537af0ca06aeb786786539cf62a773d4..ea076ba4fef2db687cc7490a92ebf91ab51ffce7 100644 (file)
@@ -3943,6 +3943,7 @@ class ClassPropertiesAndMethods(unittest.TestCase):
         del C.__del__
 
     @unittest.skipIf(support.is_emscripten, "Seems to works in Pyodide?")
+    @support.skip_wasi_stack_overflow()
     def test_slots_trash(self):
         # Testing slot trash...
         # Deallocating deeply nested slotted trash caused stack overflows
@@ -4868,6 +4869,7 @@ class ClassPropertiesAndMethods(unittest.TestCase):
                 deque.append(thing, thing)
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_repr_as_str(self):
         # Issue #11603: crash or infinite loop when rebinding __str__ as
         # __repr__.
index 242d7ced007b1003dec4ed6b138bc71bf260f578..5df2c41c6b56bc90d6c6f096b2a9c6b9171eaac3 100644 (file)
@@ -1,7 +1,7 @@
 import collections.abc
 import types
 import unittest
-from test.support import skip_emscripten_stack_overflow, exceeds_recursion_limit
+from test.support import skip_emscripten_stack_overflow, skip_wasi_stack_overflow, exceeds_recursion_limit
 
 class TestExceptionGroupTypeHierarchy(unittest.TestCase):
     def test_exception_group_types(self):
@@ -465,12 +465,14 @@ class DeepRecursionInSplitAndSubgroup(unittest.TestCase):
         return e
 
     @skip_emscripten_stack_overflow()
+    @skip_wasi_stack_overflow()
     def test_deep_split(self):
         e = self.make_deep_eg()
         with self.assertRaises(RecursionError):
             e.split(TypeError)
 
     @skip_emscripten_stack_overflow()
+    @skip_wasi_stack_overflow()
     def test_deep_subgroup(self):
         e = self.make_deep_eg()
         with self.assertRaises(RecursionError):
index daad00e86432d059b06dc9251e393eb6edd803bf..f440fc28ee7b7d4b8a1987b092c3db3738c8dfed 100644 (file)
@@ -318,6 +318,7 @@ class TestIsInstanceIsSubclass(unittest.TestCase):
             self.assertRaises(RecursionError, isinstance, 1, X())
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_infinite_recursion_via_bases_tuple(self):
         """Regression test for bpo-30570."""
         class Failure(object):
@@ -328,6 +329,7 @@ class TestIsInstanceIsSubclass(unittest.TestCase):
                 issubclass(Failure(), int)
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_infinite_cycle_in_bases(self):
         """Regression test for bpo-30570."""
         class X:
index d82093f3895167697769808e8bfd9a49cbe62b11..8f0e5e078ed0d4876d9fdcc259cbff826c283716 100644 (file)
@@ -69,6 +69,7 @@ class TestRecursion:
 
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_highly_nested_objects_decoding(self):
         very_deep = 200000
         # test that loading highly-nested objects doesn't segfault when C
@@ -98,6 +99,7 @@ class TestRecursion:
                 self.dumps(d)
 
     @support.skip_emscripten_stack_overflow()
+    @support.skip_wasi_stack_overflow()
     def test_endless_recursion(self):
         # See #12051
         class EndlessJSONEncoder(self.json.JSONEncoder):
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst
new file mode 100644 (file)
index 0000000..34a2f4d
--- /dev/null
@@ -0,0 +1,3 @@
+Remove special-casing for C stack depth limits for WASI. Due to
+WebAssembly's built-in stack protection this does not pose a security
+concern.
index 490b653f132a6a3d47db22437094646d90c1683d..d1b6b9f1a1a35f8315774fa4d0b5c760f077e91d 100644 (file)
@@ -360,9 +360,6 @@ _Py_EnterRecursiveCallUnchecked(PyThreadState *tstate)
 #  define Py_C_STACK_SIZE 1200000
 #elif defined(__sparc__)
 #  define Py_C_STACK_SIZE 1600000
-#elif defined(__wasi__)
-   /* Web assembly has two stacks, so this isn't really the stack depth */
-#  define Py_C_STACK_SIZE 131072  // wasi-libc DEFAULT_STACK_SIZE
 #elif defined(__hppa__) || defined(__powerpc64__)
 #  define Py_C_STACK_SIZE 2000000
 #else