]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117953: Imply Single-phase Init if the Init Function Fails (gh-118684)
authorEric Snow <ericsnowcurrently@gmail.com>
Tue, 7 May 2024 03:16:22 +0000 (21:16 -0600)
committerGitHub <noreply@github.com>
Tue, 7 May 2024 03:16:22 +0000 (21:16 -0600)
This ensures the kind is always either _Py_ext_module_kind_SINGLEPHASE or _Py_ext_module_kind_MULTIPHASE.

Python/importdl.c

index 38f56db4b4cc96ac69de1fba56aad38dc4214a3d..7c42d37283c4954538711bd9fc71119c8c7a35c4 100644 (file)
@@ -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,