mirror of https://github.com/python/cpython.git
SF patch #471839: Bug when extensions import extensions (Shane Hathaway)
When an extension imports another extension in its initXXX() function, the variable _Py_PackageContext is prematurely reset to NULL. If the outer extension then calls Py_InitModule(), the extension is installed in sys.modules without its package name. The manifestation of this bug is a "SystemError: _PyImport_FixupExtension: module <package>.<extension> not loaded". To fix this, importdl.c just needs to retain the old value of _Py_PackageContext and restore it after the initXXX() method is called. The attached patch does this. This patch applies to Python 2.1.1 and the current CVS.
This commit is contained in:
parent
b6aca6afe2
commit
ae9e7960d3
|
@ -22,7 +22,7 @@ PyObject *
|
||||||
_PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
|
_PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
|
||||||
{
|
{
|
||||||
PyObject *m, *d, *s;
|
PyObject *m, *d, *s;
|
||||||
char *lastdot, *shortname, *packagecontext;
|
char *lastdot, *shortname, *packagecontext, *oldcontext;
|
||||||
dl_funcptr p;
|
dl_funcptr p;
|
||||||
|
|
||||||
if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
|
if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
|
||||||
|
@ -48,9 +48,10 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
|
||||||
shortname);
|
shortname);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
oldcontext = _Py_PackageContext;
|
||||||
_Py_PackageContext = packagecontext;
|
_Py_PackageContext = packagecontext;
|
||||||
(*p)();
|
(*p)();
|
||||||
_Py_PackageContext = NULL;
|
_Py_PackageContext = oldcontext;
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
if (_PyImport_FixupExtension(name, pathname) == NULL)
|
if (_PyImport_FixupExtension(name, pathname) == NULL)
|
||||||
|
|
Loading…
Reference in New Issue