Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path
Document also that dynamic module names are ASCII only
diff --git a/Python/import.c b/Python/import.c
index 8fab810..4e5cb2d 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2173,9 +2173,21 @@
break;
#ifdef HAVE_DYNAMIC_LOADING
- case C_EXTENSION:
- m = _PyImport_LoadDynamicModule(name, pathname, fp);
+ case C_EXTENSION: {
+ PyObject *nameobj, *pathobj;
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+ pathobj = PyUnicode_DecodeFSDefault(pathname);
+ if (pathobj == NULL) {
+ Py_DECREF(nameobj);
+ return NULL;
+ }
+ m = _PyImport_LoadDynamicModule(nameobj, pathobj, fp);
+ Py_DECREF(nameobj);
+ Py_DECREF(pathobj);
break;
+ }
#endif
case PKG_DIRECTORY:
@@ -2185,11 +2197,10 @@
case C_BUILTIN:
case PY_FROZEN: {
PyObject *nameobj = PyUnicode_FromString(name);
- if (nameobj != NULL) {
- m = load_builtin(nameobj, type);
- Py_DECREF(nameobj);
- } else
- m = NULL;
+ if (nameobj == NULL)
+ return NULL;
+ m = load_builtin(nameobj, type);
+ Py_DECREF(nameobj);
break;
}
@@ -3443,28 +3454,23 @@
static PyObject *
imp_load_dynamic(PyObject *self, PyObject *args)
{
- char *name;
- PyObject *pathbytes;
- char *pathname;
- PyObject *fob = NULL;
- PyObject *m;
- FILE *fp = NULL;
- if (!PyArg_ParseTuple(args, "sO&|O:load_dynamic",
- &name, PyUnicode_FSConverter, &pathbytes, &fob))
+ PyObject *name, *pathname, *fob = NULL, *mod;
+ FILE *fp;
+
+ if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic",
+ &name, PyUnicode_FSDecoder, &pathname, &fob))
return NULL;
- pathname = PyBytes_AS_STRING(pathbytes);
- if (fob) {
- fp = get_file(pathname, fob, "r");
- if (fp == NULL) {
- Py_DECREF(pathbytes);
+ if (fob != NULL) {
+ fp = get_file(NULL, fob, "r");
+ if (fp == NULL)
return NULL;
- }
}
- m = _PyImport_LoadDynamicModule(name, pathname, fp);
- Py_DECREF(pathbytes);
+ else
+ fp = NULL;
+ mod = _PyImport_LoadDynamicModule(name, pathname, fp);
if (fp)
fclose(fp);
- return m;
+ return mod;
}
#endif /* HAVE_DYNAMIC_LOADING */