summaryrefslogtreecommitdiffstats
path: root/Python/importdl.c
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2024-05-07 03:16:22 (GMT)
committerGitHub <noreply@github.com>2024-05-07 03:16:22 (GMT)
commit1a23716d4ba6c6dadd76a3662db580f451f660e3 (patch)
tree4f213f50a194d005e1cda4682757dc46af8a2513 /Python/importdl.c
parent853163d3b5fa56d54a47817642c804b5d0c9f8e5 (diff)
downloadcpython-1a23716d4ba6c6dadd76a3662db580f451f660e3.zip
cpython-1a23716d4ba6c6dadd76a3662db580f451f660e3.tar.gz
cpython-1a23716d4ba6c6dadd76a3662db580f451f660e3.tar.bz2
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.
Diffstat (limited to 'Python/importdl.c')
-rw-r--r--Python/importdl.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/Python/importdl.c b/Python/importdl.c
index 38f56db..7c42d37 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -426,6 +426,11 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
/* Validate the result (and populate "res". */
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()) {
_Py_ext_module_loader_result_set_error(
&res, _Py_ext_module_loader_result_EXCEPTION);
@@ -436,6 +441,8 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
}
goto error;
} 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(
&res, _Py_ext_module_loader_result_ERR_UNREPORTED_EXC);
/* We would probably be correct to decref m here,