https://github.com/python/cpython/commit/ad42dc1909bdf8ec775b63fb22ed48ff42797a17
commit: ad42dc1909bdf8ec775b63fb22ed48ff42797a17
branch: main
author: Brett Cannon <[email protected]>
committer: brettcannon <[email protected]>
date: 2025-05-22T14:08:44-07:00
summary:
GH-130397: remove special-casing of C stack depth for WASI (#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.
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 -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]