mirror of
https://github.com/python/cpython.git
synced 2025-09-27 18:59:43 +00:00
Issue #3080: load_module() expects name and path as Unicode
This commit is contained in:
parent
2f42ae53aa
commit
41c5fecce0
1 changed files with 55 additions and 81 deletions
136
Python/import.c
136
Python/import.c
|
@ -1490,7 +1490,7 @@ unchanged:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Forward */
|
/* Forward */
|
||||||
static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
|
static PyObject *load_module(PyObject *, FILE *, PyObject *, int, PyObject *);
|
||||||
static struct filedescr *find_module(char *, const char *, PyObject *,
|
static struct filedescr *find_module(char *, const char *, PyObject *,
|
||||||
char *, size_t, FILE **, PyObject **);
|
char *, size_t, FILE **, PyObject **);
|
||||||
static struct _frozen * find_frozen(PyObject *);
|
static struct _frozen * find_frozen(PyObject *);
|
||||||
|
@ -1501,7 +1501,7 @@ static struct _frozen * find_frozen(PyObject *);
|
||||||
static PyObject *
|
static PyObject *
|
||||||
load_package(PyObject *name, PyObject *pathname)
|
load_package(PyObject *name, PyObject *pathname)
|
||||||
{
|
{
|
||||||
PyObject *m, *d;
|
PyObject *m, *d, *bufobj;
|
||||||
PyObject *file = NULL, *path_list = NULL;
|
PyObject *file = NULL, *path_list = NULL;
|
||||||
int err;
|
int err;
|
||||||
char buf[MAXPATHLEN+1];
|
char buf[MAXPATHLEN+1];
|
||||||
|
@ -1546,7 +1546,13 @@ load_package(PyObject *name, PyObject *pathname)
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
m = load_module(namestr, fp, buf, fdp->type, NULL);
|
bufobj = PyUnicode_DecodeFSDefault(buf);
|
||||||
|
if (bufobj != NULL) {
|
||||||
|
m = load_module(name, fp, bufobj, fdp->type, NULL);
|
||||||
|
Py_DECREF(bufobj);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m = NULL;
|
||||||
if (fp != NULL)
|
if (fp != NULL)
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return m;
|
return m;
|
||||||
|
@ -2303,7 +2309,7 @@ load_builtin(PyObject *name, int type)
|
||||||
its module object WITH INCREMENTED REFERENCE COUNT */
|
its module object WITH INCREMENTED REFERENCE COUNT */
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
|
load_module(PyObject *name, FILE *fp, PyObject *pathname, int type, PyObject *loader)
|
||||||
{
|
{
|
||||||
PyObject *m;
|
PyObject *m;
|
||||||
|
|
||||||
|
@ -2313,7 +2319,7 @@ load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
|
||||||
case PY_COMPILED:
|
case PY_COMPILED:
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
PyErr_Format(PyExc_ValueError,
|
PyErr_Format(PyExc_ValueError,
|
||||||
"file object required for import (type code %d)",
|
"file object required for import (type code %d)",
|
||||||
type);
|
type);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2321,81 +2327,28 @@ load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|
||||||
case PY_SOURCE: {
|
case PY_SOURCE:
|
||||||
PyObject *nameobj, *pathobj;
|
m = load_source_module(name, pathname, fp);
|
||||||
nameobj = PyUnicode_FromString(name);
|
|
||||||
if (nameobj == NULL)
|
|
||||||
return NULL;
|
|
||||||
pathobj = PyUnicode_DecodeFSDefault(pathname);
|
|
||||||
if (pathobj == NULL) {
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
m = load_source_module(nameobj, pathobj, fp);
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
Py_DECREF(pathobj);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case PY_COMPILED: {
|
case PY_COMPILED:
|
||||||
PyObject *nameobj, *pathobj;
|
m = load_compiled_module(name, pathname, fp);
|
||||||
nameobj = PyUnicode_FromString(name);
|
|
||||||
if (nameobj == NULL)
|
|
||||||
return NULL;
|
|
||||||
pathobj = PyUnicode_DecodeFSDefault(pathname);
|
|
||||||
if (pathobj == NULL) {
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
m = load_compiled_module(nameobj, pathobj, fp);
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
Py_DECREF(pathobj);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_DYNAMIC_LOADING
|
#ifdef HAVE_DYNAMIC_LOADING
|
||||||
case C_EXTENSION: {
|
case C_EXTENSION:
|
||||||
PyObject *nameobj, *pathobj;
|
m = _PyImport_LoadDynamicModule(name, pathname, fp);
|
||||||
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;
|
break;
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case PKG_DIRECTORY: {
|
case PKG_DIRECTORY:
|
||||||
PyObject *nameobj, *pathobj;
|
m = load_package(name, pathname);
|
||||||
nameobj = PyUnicode_FromString(name);
|
|
||||||
if (nameobj == NULL)
|
|
||||||
return NULL;
|
|
||||||
pathobj = PyUnicode_DecodeFSDefault(pathname);
|
|
||||||
if (pathobj == NULL) {
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
m = load_package(nameobj, pathobj);
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
Py_DECREF(pathobj);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case C_BUILTIN:
|
case C_BUILTIN:
|
||||||
case PY_FROZEN: {
|
case PY_FROZEN:
|
||||||
PyObject *nameobj = PyUnicode_FromString(name);
|
m = load_builtin(name, type);
|
||||||
if (nameobj == NULL)
|
|
||||||
return NULL;
|
|
||||||
m = load_builtin(nameobj, type);
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case IMP_HOOK: {
|
case IMP_HOOK: {
|
||||||
if (loader == NULL) {
|
if (loader == NULL) {
|
||||||
|
@ -2403,13 +2356,13 @@ load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
|
||||||
"import hook without loader");
|
"import hook without loader");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
m = PyObject_CallMethod(loader, "load_module", "s", name);
|
m = PyObject_CallMethod(loader, "load_module", "O", name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
PyErr_Format(PyExc_ImportError,
|
PyErr_Format(PyExc_ImportError,
|
||||||
"Don't know how to import %.200s (type code %d)",
|
"Don't know how to import %U (type code %d)",
|
||||||
name, type);
|
name, type);
|
||||||
m = NULL;
|
m = NULL;
|
||||||
|
|
||||||
|
@ -3144,7 +3097,7 @@ static PyObject *
|
||||||
import_submodule(PyObject *mod, char *subname, char *fullname)
|
import_submodule(PyObject *mod, char *subname, char *fullname)
|
||||||
{
|
{
|
||||||
PyObject *modules = PyImport_GetModuleDict();
|
PyObject *modules = PyImport_GetModuleDict();
|
||||||
PyObject *m = NULL;
|
PyObject *m = NULL, *fullnameobj, *bufobj;
|
||||||
|
|
||||||
/* Require:
|
/* Require:
|
||||||
if mod == None: subname == fullname
|
if mod == None: subname == fullname
|
||||||
|
@ -3181,7 +3134,19 @@ import_submodule(PyObject *mod, char *subname, char *fullname)
|
||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
m = load_module(fullname, fp, buf, fdp->type, loader);
|
fullnameobj = PyUnicode_FromString(fullname);
|
||||||
|
if (fullnameobj != NULL) {
|
||||||
|
bufobj = PyUnicode_DecodeFSDefault(buf);
|
||||||
|
if (bufobj != NULL) {
|
||||||
|
m = load_module(fullnameobj, fp, bufobj, fdp->type, loader);
|
||||||
|
Py_DECREF(bufobj);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m = NULL;
|
||||||
|
Py_DECREF(fullnameobj);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m = NULL;
|
||||||
Py_XDECREF(loader);
|
Py_XDECREF(loader);
|
||||||
if (fp)
|
if (fp)
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
@ -3209,7 +3174,7 @@ PyImport_ReloadModule(PyObject *m)
|
||||||
char buf[MAXPATHLEN+1];
|
char buf[MAXPATHLEN+1];
|
||||||
struct filedescr *fdp;
|
struct filedescr *fdp;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
PyObject *newm;
|
PyObject *newm, *nameobj, *bufobj;
|
||||||
|
|
||||||
if (modules_reloading == NULL) {
|
if (modules_reloading == NULL) {
|
||||||
Py_FatalError("PyImport_ReloadModule: "
|
Py_FatalError("PyImport_ReloadModule: "
|
||||||
|
@ -3275,7 +3240,19 @@ PyImport_ReloadModule(PyObject *m)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
newm = load_module(name, fp, buf, fdp->type, loader);
|
nameobj = PyUnicode_FromString(name);
|
||||||
|
if (nameobj != NULL) {
|
||||||
|
bufobj = PyUnicode_DecodeFSDefault(buf);
|
||||||
|
if (bufobj != NULL) {
|
||||||
|
newm = load_module(nameobj, fp, bufobj, fdp->type, loader);
|
||||||
|
Py_DECREF(bufobj);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
newm = NULL;
|
||||||
|
Py_DECREF(nameobj);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
newm = NULL;
|
||||||
Py_XDECREF(loader);
|
Py_XDECREF(loader);
|
||||||
|
|
||||||
if (fp)
|
if (fp)
|
||||||
|
@ -3691,18 +3668,15 @@ imp_load_source(PyObject *self, PyObject *args)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
imp_load_module(PyObject *self, PyObject *args)
|
imp_load_module(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
char *name;
|
PyObject *name, *fob, *pathname, *ret;
|
||||||
PyObject *fob;
|
|
||||||
PyObject *pathname;
|
|
||||||
PyObject * ret;
|
|
||||||
char *suffix; /* Unused */
|
char *suffix; /* Unused */
|
||||||
char *mode;
|
char *mode;
|
||||||
int type;
|
int type;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "sOO&(ssi):load_module",
|
if (!PyArg_ParseTuple(args, "UOO&(ssi):load_module",
|
||||||
&name, &fob,
|
&name, &fob,
|
||||||
PyUnicode_FSConverter, &pathname,
|
PyUnicode_FSDecoder, &pathname,
|
||||||
&suffix, &mode, &type))
|
&suffix, &mode, &type))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (*mode) {
|
if (*mode) {
|
||||||
|
@ -3726,7 +3700,7 @@ imp_load_module(PyObject *self, PyObject *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = load_module(name, fp, PyBytes_AS_STRING(pathname), type, NULL);
|
ret = load_module(name, fp, pathname, type, NULL);
|
||||||
Py_DECREF(pathname);
|
Py_DECREF(pathname);
|
||||||
if (fp)
|
if (fp)
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue