]> granicus.if.org Git - python/commitdiff
SF patch #471839: Bug when extensions import extensions (Shane Hathaway)
authorGuido van Rossum <guido@python.org>
Tue, 16 Oct 2001 20:07:34 +0000 (20:07 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 16 Oct 2001 20:07:34 +0000 (20:07 +0000)
    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.

Python/importdl.c

index 4a1048d4960fd34b6132f252a625c94626bd0424..9255bbf58453db8f75199ad6390a2fb989023a9f 100644 (file)
@@ -22,7 +22,7 @@ PyObject *
 _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
 {
        PyObject *m, *d, *s;
-       char *lastdot, *shortname, *packagecontext;
+       char *lastdot, *shortname, *packagecontext, *oldcontext;
        dl_funcptr p;
 
        if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
@@ -48,9 +48,10 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
                             shortname);
                return NULL;
        }
+        oldcontext = _Py_PackageContext;
        _Py_PackageContext = packagecontext;
        (*p)();
-       _Py_PackageContext = NULL;
+       _Py_PackageContext = oldcontext;
        if (PyErr_Occurred())
                return NULL;
        if (_PyImport_FixupExtension(name, pathname) == NULL)