gh-117953: Imply Single-phase Init if the Init Function Fails (gh-118684)

This ensures the kind is always either _Py_ext_module_kind_SINGLEPHASE or _Py_ext_module_kind_MULTIPHASE.
This commit is contained in:
Eric Snow 2024-05-06 21:16:22 -06:00 committed by GitHub
parent 853163d3b5
commit 1a23716d4b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 7 additions and 0 deletions

View File

@ -426,6 +426,11 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
/* Validate the result (and populate "res". */ /* Validate the result (and populate "res". */
if (m == NULL) { if (m == NULL) {
/* The init func for multi-phase init modules is expected
* to return a PyModuleDef after calling PyModuleDef_Init().
* That function never raises an exception nor returns NULL,
* so at this point it must be a single-phase init modules. */
res.kind = _Py_ext_module_kind_SINGLEPHASE;
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
_Py_ext_module_loader_result_set_error( _Py_ext_module_loader_result_set_error(
&res, _Py_ext_module_loader_result_EXCEPTION); &res, _Py_ext_module_loader_result_EXCEPTION);
@ -436,6 +441,8 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
} }
goto error; goto error;
} else if (PyErr_Occurred()) { } else if (PyErr_Occurred()) {
/* Likewise, we infer that this is a single-phase init module. */
res.kind = _Py_ext_module_kind_SINGLEPHASE;
_Py_ext_module_loader_result_set_error( _Py_ext_module_loader_result_set_error(
&res, _Py_ext_module_loader_result_ERR_UNREPORTED_EXC); &res, _Py_ext_module_loader_result_ERR_UNREPORTED_EXC);
/* We would probably be correct to decref m here, /* We would probably be correct to decref m here,