Mercurial > cpython-lru_cache-weakref
diff Python/import.c @ 49651:aa6e649599ad
fix #4211: the __path__ of a frozen package should be a list.
Patch by Brett Cannon, review by Christian Heimes.
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Wed, 05 Nov 2008 22:48:33 +0000 |
| parents | f6650f247598 |
| children | fb725366f9ac |
line wrap: on
line diff
--- a/Python/import.c Wed Nov 05 21:42:45 2008 +0000 +++ b/Python/import.c Wed Nov 05 22:48:33 2008 +0000 @@ -1293,37 +1293,16 @@ Py_DECREF(meta_path); } - if (path != NULL && PyUnicode_Check(path)) { - /* The only type of submodule allowed inside a "frozen" - package are other frozen modules or packages. */ - char *p = _PyUnicode_AsString(path); - if (strlen(p) + 1 + strlen(name) >= (size_t)buflen) { - PyErr_SetString(PyExc_ImportError, - "full frozen module name too long"); - return NULL; - } - strcpy(buf, p); - strcat(buf, "."); - strcat(buf, name); - strcpy(name, buf); - if (find_frozen(name) != NULL) { - strcpy(buf, name); - return &fd_frozen; - } - PyErr_Format(PyExc_ImportError, - "No frozen submodule named %.200s", name); - return NULL; + if (find_frozen(fullname) != NULL) { + strcpy(buf, fullname); + return &fd_frozen; } + if (path == NULL) { if (is_builtin(name)) { strcpy(buf, name); return &fd_builtin; } - if ((find_frozen(name)) != NULL) { - strcpy(buf, name); - return &fd_frozen; - } - #ifdef MS_COREDLL fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen); if (fp != NULL) { @@ -1333,6 +1312,7 @@ #endif path = PySys_GetObject("path"); } + if (path == NULL || !PyList_Check(path)) { PyErr_SetString(PyExc_ImportError, "sys.path must be a list of directory names"); @@ -1886,6 +1866,9 @@ { struct _frozen *p; + if (!name) + return NULL; + for (p = PyImport_FrozenModules; ; p++) { if (p->name == NULL) return NULL; @@ -1959,7 +1942,7 @@ } if (ispackage) { /* Set __path__ to the package name */ - PyObject *d, *s; + PyObject *d, *s, *l; int err; m = PyImport_AddModule(name); if (m == NULL) @@ -1968,8 +1951,14 @@ s = PyUnicode_InternFromString(name); if (s == NULL) goto err_return; - err = PyDict_SetItemString(d, "__path__", s); - Py_DECREF(s); + l = PyList_New(1); + if (l == NULL) { + Py_DECREF(s); + goto err_return; + } + PyList_SET_ITEM(l, 0, s); + err = PyDict_SetItemString(d, "__path__", l); + Py_DECREF(l); if (err != 0) goto err_return; }
