Skip to content

Commit

Permalink
pythongh-109894: Fix initialization of static MemoryError in subint…
Browse files Browse the repository at this point in the history
…erpreter (pythongh-110911)

Fixes python#109894

* set `interp.static_objects.last_resort_memory_error.args` to empty tuple to avoid crash on `PyErr_Display()` call
* allow `_PyExc_InitGlobalObjects()` to be called on subinterpreter init

---------

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
  • Loading branch information
2 people authored and Glyphack committed Jan 27, 2024
1 parent d3624de commit f9e0eb4
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 4 deletions.
1 change: 1 addition & 0 deletions Include/internal/pycore_runtime_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ extern PyTypeObject _PyExc_MemoryError;
}, \
.last_resort_memory_error = { \
_PyObject_HEAD_INIT(&_PyExc_MemoryError) \
.args = (PyObject*)&_Py_SINGLETON(tuple_empty) \
}, \
}, \
}, \
Expand Down
14 changes: 14 additions & 0 deletions Lib/test/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1791,6 +1791,20 @@ class TestException(MemoryError):

gc_collect()

def test_memory_error_in_subinterp(self):
# gh-109894: subinterpreters shouldn't count on last resort memory error
# when MemoryError is raised through PyErr_NoMemory() call,
# and should preallocate memory errors as does the main interpreter.
# interp.static_objects.last_resort_memory_error.args
# should be initialized to empty tuple to avoid crash on attempt to print it.
code = f"""if 1:
import _testcapi
_testcapi.run_in_subinterp(\"[0]*{sys.maxsize}\")
exit(0)
"""
rc, _, err = script_helper.assert_python_ok("-c", code)
self.assertIn(b'MemoryError', err)


class NameErrorTests(unittest.TestCase):
def test_name_error_has_name(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed crash due to improperly initialized static :exc:`MemoryError` in subinterpreter.
4 changes: 0 additions & 4 deletions Objects/exceptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -3700,10 +3700,6 @@ _PyExc_FiniTypes(PyInterpreterState *interp)
PyStatus
_PyExc_InitGlobalObjects(PyInterpreterState *interp)
{
if (!_Py_IsMainInterpreter(interp)) {
return _PyStatus_OK();
}

if (preallocate_memerrors() < 0) {
return _PyStatus_NO_MEMORY();
}
Expand Down

0 comments on commit f9e0eb4

Please sign in to comment.