mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	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
					
				
					 1 changed files with 3 additions and 2 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue