gh-141169: Re-raise exception from findfuncptr (GH-141349)

This commit is contained in:
Petr Viktorin 2025-11-11 13:52:13 +01:00 committed by GitHub
parent d69447445c
commit 799326b0a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 25 deletions

View file

@ -14,6 +14,34 @@ extern "C" {
extern const char *_PyImport_DynLoadFiletab[]; extern const char *_PyImport_DynLoadFiletab[];
#ifdef HAVE_DYNAMIC_LOADING
/* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
supported on this platform. configure will then compile and link in one
of the dynload_*.c files, as appropriate. We will call a function in
those modules to get a function pointer to the module's init function.
The function should return:
- The function pointer on success
- NULL with exception set if the library cannot be loaded
- NULL *without* an extension set if the library could be loaded but the
function cannot be found in it.
*/
#ifdef MS_WINDOWS
#include <windows.h>
typedef FARPROC dl_funcptr;
extern dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
const char *shortname,
PyObject *pathname,
FILE *fp);
#else
typedef void (*dl_funcptr)(void);
extern dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix,
const char *shortname,
const char *pathname, FILE *fp);
#endif
#endif /* HAVE_DYNAMIC_LOADING */
typedef enum ext_module_kind { typedef enum ext_module_kind {
_Py_ext_module_kind_UNKNOWN = 0, _Py_ext_module_kind_UNKNOWN = 0,
@ -112,8 +140,6 @@ extern int _PyImport_RunModInitFunc(
#define MAXSUFFIXSIZE 12 #define MAXSUFFIXSIZE 12
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
#include <windows.h>
typedef FARPROC dl_funcptr;
#ifdef Py_DEBUG #ifdef Py_DEBUG
# define PYD_DEBUG_SUFFIX "_d" # define PYD_DEBUG_SUFFIX "_d"
@ -136,8 +162,6 @@ typedef FARPROC dl_funcptr;
#define PYD_TAGGED_SUFFIX PYD_DEBUG_SUFFIX "." PYD_SOABI ".pyd" #define PYD_TAGGED_SUFFIX PYD_DEBUG_SUFFIX "." PYD_SOABI ".pyd"
#define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd" #define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd"
#else
typedef void (*dl_funcptr)(void);
#endif #endif

View file

@ -10,27 +10,6 @@
#include "pycore_runtime.h" // _Py_ID() #include "pycore_runtime.h" // _Py_ID()
/* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
supported on this platform. configure will then compile and link in one
of the dynload_*.c files, as appropriate. We will call a function in
those modules to get a function pointer to the module's init function.
*/
#ifdef HAVE_DYNAMIC_LOADING
#ifdef MS_WINDOWS
extern dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
const char *shortname,
PyObject *pathname,
FILE *fp);
#else
extern dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix,
const char *shortname,
const char *pathname, FILE *fp);
#endif
#endif /* HAVE_DYNAMIC_LOADING */
/***********************************/ /***********************************/
/* module info to use when loading */ /* module info to use when loading */
/***********************************/ /***********************************/
@ -414,6 +393,9 @@ _PyImport_GetModuleExportHooks(
*modexport = (PyModExportFunction)exportfunc; *modexport = (PyModExportFunction)exportfunc;
return 2; return 2;
} }
if (PyErr_Occurred()) {
return -1;
}
exportfunc = findfuncptr( exportfunc = findfuncptr(
info->hook_prefixes->init_prefix, info->hook_prefixes->init_prefix,