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.
This commit is contained in:
Brett Cannon 2025-05-22 14:08:44 -07:00 committed by GitHub
parent 742d5b5c5d
commit ad42dc1909
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 15 additions and 7 deletions

View 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

View 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

View 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__.

View 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):

View 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:

View 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):

View file

@ -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.

View 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