[Python-checkins] cpython: Issue #3080: load_module() expects name and path as Unicode

victor.stinner python-checkins at python.org
Sun Mar 20 04:13:47 CET 2011


http://hg.python.org/cpython/rev/64c21f364519
changeset:   68723:64c21f364519
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Sun Mar 13 21:46:30 2011 -0400
summary:
  Issue #3080: load_module() expects name and path as Unicode

files:
  Python/import.c

diff --git a/Python/import.c b/Python/import.c
--- a/Python/import.c
+++ b/Python/import.c
@@ -1490,7 +1490,7 @@
 }
 
 /* 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 *,
                                      char *, size_t, FILE **, PyObject **);
 static struct _frozen * find_frozen(PyObject *);
@@ -1501,7 +1501,7 @@
 static PyObject *
 load_package(PyObject *name, PyObject *pathname)
 {
-    PyObject *m, *d;
+    PyObject *m, *d, *bufobj;
     PyObject *file = NULL, *path_list = NULL;
     int err;
     char buf[MAXPATHLEN+1];
@@ -1546,7 +1546,13 @@
         else
             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)
         fclose(fp);
     return m;
@@ -2303,7 +2309,7 @@
    its module object WITH INCREMENTED REFERENCE COUNT */
 
 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;
 
@@ -2313,7 +2319,7 @@
     case PY_COMPILED:
         if (fp == NULL) {
             PyErr_Format(PyExc_ValueError,
-               "file object required for import (type code %d)",
+                         "file object required for import (type code %d)",
                          type);
             return NULL;
         }
@@ -2321,81 +2327,28 @@
 
     switch (type) {
 
-    case PY_SOURCE: {
-        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 = load_source_module(nameobj, pathobj, fp);
-        Py_DECREF(nameobj);
-        Py_DECREF(pathobj);
+    case PY_SOURCE:
+        m = load_source_module(name, pathname, fp);
         break;
-    }
-
-    case PY_COMPILED: {
-        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 = load_compiled_module(nameobj, pathobj, fp);
-        Py_DECREF(nameobj);
-        Py_DECREF(pathobj);
+
+    case PY_COMPILED:
+        m = load_compiled_module(name, pathname, fp);
         break;
-    }
 
 #ifdef HAVE_DYNAMIC_LOADING
-    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);
+    case C_EXTENSION:
+        m = _PyImport_LoadDynamicModule(name, pathname, fp);
         break;
-    }
 #endif
 
-    case PKG_DIRECTORY: {
-        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 = load_package(nameobj, pathobj);
-        Py_DECREF(nameobj);
-        Py_DECREF(pathobj);
+    case PKG_DIRECTORY:
+        m = load_package(name, pathname);
         break;
-    }
 
     case C_BUILTIN:
-    case PY_FROZEN: {
-        PyObject *nameobj = PyUnicode_FromString(name);
-        if (nameobj == NULL)
-            return NULL;
-        m = load_builtin(nameobj, type);
-        Py_DECREF(nameobj);
+    case PY_FROZEN:
+        m = load_builtin(name, type);
         break;
-    }
 
     case IMP_HOOK: {
         if (loader == NULL) {
@@ -2403,13 +2356,13 @@
                             "import hook without loader");
             return NULL;
         }
-        m = PyObject_CallMethod(loader, "load_module", "s", name);
+        m = PyObject_CallMethod(loader, "load_module", "O", name);
         break;
     }
 
     default:
         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);
         m = NULL;
 
@@ -3144,7 +3097,7 @@
 import_submodule(PyObject *mod, char *subname, char *fullname)
 {
     PyObject *modules = PyImport_GetModuleDict();
-    PyObject *m = NULL;
+    PyObject *m = NULL, *fullnameobj, *bufobj;
 
     /* Require:
        if mod == None: subname == fullname
@@ -3181,7 +3134,19 @@
             Py_INCREF(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);
         if (fp)
             fclose(fp);
@@ -3209,7 +3174,7 @@
     char buf[MAXPATHLEN+1];
     struct filedescr *fdp;
     FILE *fp;
-    PyObject *newm;
+    PyObject *newm, *nameobj, *bufobj;
 
     if (modules_reloading == NULL) {
         Py_FatalError("PyImport_ReloadModule: "
@@ -3275,7 +3240,19 @@
         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);
 
     if (fp)
@@ -3691,18 +3668,15 @@
 static PyObject *
 imp_load_module(PyObject *self, PyObject *args)
 {
-    char *name;
-    PyObject *fob;
-    PyObject *pathname;
-    PyObject * ret;
+    PyObject *name, *fob, *pathname, *ret;
     char *suffix; /* Unused */
     char *mode;
     int type;
     FILE *fp;
 
-    if (!PyArg_ParseTuple(args, "sOO&(ssi):load_module",
+    if (!PyArg_ParseTuple(args, "UOO&(ssi):load_module",
                           &name, &fob,
-                          PyUnicode_FSConverter, &pathname,
+                          PyUnicode_FSDecoder, &pathname,
                           &suffix, &mode, &type))
         return NULL;
     if (*mode) {
@@ -3726,7 +3700,7 @@
             return NULL;
         }
     }
-    ret = load_module(name, fp, PyBytes_AS_STRING(pathname), type, NULL);
+    ret = load_module(name, fp, pathname, type, NULL);
     Py_DECREF(pathname);
     if (fp)
         fclose(fp);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list