https://github.com/python/cpython/commit/15e26eebf79d2337eb20338fd9c90f7d3bcd047c
commit: 15e26eebf79d2337eb20338fd9c90f7d3bcd047c
branch: 3.14
author: Miss Islington (bot) <31488909+miss-isling...@users.noreply.github.com>
committer: brettcannon <br...@python.org>
date: 2025-05-22T14:42:23-07:00
summary:

[3.14] GH-130397: remove special-casing of C stack depth for WASI (GH-134469) 
(GH-134547)

GH-130397: remove special-casing of C stack depth for WASI (GH-134469)

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.
(cherry picked from commit ad42dc1909bdf8ec775b63fb22ed48ff42797a17)

Co-authored-by: Brett Cannon <br...@python.org>

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst
M Include/pythonrun.h
M Lib/test/test_copy.py
M Lib/test/test_descr.py
M Lib/test/test_exception_group.py
M Lib/test/test_isinstance.py
M Lib/test/test_json/test_recursion.py
M Python/ceval.c

diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index fad2b3c77476e4..716c4ab3c81cae 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -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
diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py
index 3cb8072abefe98..467ec09d99e462 100644
--- a/Lib/test/test_copy.py
+++ b/Lib/test/test_copy.py
@@ -372,6 +372,7 @@ def test_deepcopy_list(self):
         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 @@ def test_deepcopy_tuple_of_immutables(self):
         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 @@ def test_deepcopy_dict(self):
         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
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index d635855f537af0..ea076ba4fef2db 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -3943,6 +3943,7 @@ def __del__(self):
         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 Thing:
                 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__.
diff --git a/Lib/test/test_exception_group.py b/Lib/test/test_exception_group.py
index 242d7ced007b10..5df2c41c6b56bc 100644
--- a/Lib/test/test_exception_group.py
+++ b/Lib/test/test_exception_group.py
@@ -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 @@ def make_deep_eg(self):
         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):
diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py
index daad00e86432d0..f440fc28ee7b7d 100644
--- a/Lib/test/test_isinstance.py
+++ b/Lib/test/test_isinstance.py
@@ -318,6 +318,7 @@ def __bases__(self):
             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 @@ def __getattr__(self, attr):
                 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:
diff --git a/Lib/test/test_json/test_recursion.py 
b/Lib/test/test_json/test_recursion.py
index d82093f3895167..8f0e5e078ed0d4 100644
--- a/Lib/test/test_json/test_recursion.py
+++ b/Lib/test/test_json/test_recursion.py
@@ -69,6 +69,7 @@ def default(self, o):
 
 
     @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 @@ def test_highly_nested_objects_encoding(self):
                 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
index 00000000000000..34a2f4d1278e74
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-21-15-14-32.gh-issue-130397.aG6EON.rst
@@ -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.
diff --git a/Python/ceval.c b/Python/ceval.c
index 490b653f132a6a..d1b6b9f1a1a35f 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -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

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: arch...@mail-archive.com

Reply via email to