Author: brett.cannon Date: Thu Feb 1 00:31:44 2007 New Revision: 53608 Modified: python/branches/bcannon-objcap/BRANCHNEWS python/branches/bcannon-objcap/Include/moduleobject.h python/branches/bcannon-objcap/Objects/moduleobject.c python/branches/bcannon-objcap/Python/import.c python/branches/bcannon-objcap/Python/pythonrun.c Log: Change the import machinery on how it handles importing 'sys'. Before the import code used the cached dictionary that was created after _PySys_Init() was called but before any subsequent items were added (e.g., sys.path). Now, PyImport_FindExtension() (which is what uses the extension module cache for importing new modules) checks if it is dealing with 'sys'. If it is it then sets the module's dict to the interpreter's sysdict instead of the cached version. Modified: python/branches/bcannon-objcap/BRANCHNEWS ============================================================================== --- python/branches/bcannon-objcap/BRANCHNEWS (original) +++ python/branches/bcannon-objcap/BRANCHNEWS Thu Feb 1 00:31:44 2007 @@ -8,6 +8,11 @@ Core and builtins ----------------- +* Make importing the sys module after it has been completely deleted use the + interpreter's sysdict instead of the cached dict used by the import + machinery. This lets the sys module be deleted for security reasons during + startup. + * rev. ????: Added a delegate for import that calls sys.import_. * rev. 51679: Remove the constructor for the 'code' type. This means instances Modified: python/branches/bcannon-objcap/Include/moduleobject.h ============================================================================== --- python/branches/bcannon-objcap/Include/moduleobject.h (original) +++ python/branches/bcannon-objcap/Include/moduleobject.h Thu Feb 1 00:31:44 2007 @@ -14,6 +14,7 @@ PyAPI_FUNC(PyObject *) PyModule_New(const char *); PyAPI_FUNC(PyObject *) PyModule_GetDict(PyObject *); +PyAPI_FUNC(void) PyModule_SetDict(PyObject *, PyObject *); PyAPI_FUNC(char *) PyModule_GetName(PyObject *); PyAPI_FUNC(char *) PyModule_GetFilename(PyObject *); PyAPI_FUNC(void) _PyModule_Clear(PyObject *); Modified: python/branches/bcannon-objcap/Objects/moduleobject.c ============================================================================== --- python/branches/bcannon-objcap/Objects/moduleobject.c (original) +++ python/branches/bcannon-objcap/Objects/moduleobject.c Thu Feb 1 00:31:44 2007 @@ -54,6 +54,16 @@ return d; } +void +PyModule_SetDict(PyObject *m, PyObject *new_dict) +{ + PyModuleObject *module = (PyModuleObject *)m; + PyObject *old_dict = module->md_dict; + + Py_XDECREF(old_dict); + module->md_dict = new_dict; +} + char * PyModule_GetName(PyObject *m) { Modified: python/branches/bcannon-objcap/Python/import.c ============================================================================== --- python/branches/bcannon-objcap/Python/import.c (original) +++ python/branches/bcannon-objcap/Python/import.c Thu Feb 1 00:31:44 2007 @@ -563,8 +563,17 @@ mdict = PyModule_GetDict(mod); if (mdict == NULL) return NULL; - if (PyDict_Update(mdict, dict)) - return NULL; + if ((!strcmp("sys", name)) && (!strcmp("sys", filename))) { + PyThreadState *tstate = PyThreadState_GET(); + PyObject *sysdict = tstate->interp->sysdict; + + Py_INCREF(sysdict); + PyModule_SetDict(mod, sysdict); + } + else { + if (PyDict_Update(mdict, dict)) + return NULL; + } if (Py_VerboseFlag) PySys_WriteStderr("import %s # previously loaded (%s)\n", name, filename); Modified: python/branches/bcannon-objcap/Python/pythonrun.c ============================================================================== --- python/branches/bcannon-objcap/Python/pythonrun.c (original) +++ python/branches/bcannon-objcap/Python/pythonrun.c Thu Feb 1 00:31:44 2007 @@ -357,9 +357,6 @@ Current scope of execution. * exceptions Safe to keep around. - * sys - Certain values set during Python initialization that are lost - when the module is deleted and then re-imported. * encodings Does dynamic import of encodings which requires globals() to work; globals() fails when the module has been deleted. @@ -379,7 +376,6 @@ if ((strcmp(module_name, "__builtin__") != 0) && (strcmp(module_name, "exceptions") != 0) && (strcmp(module_name, "__main__") != 0) && - (strcmp(module_name, "sys") != 0) && (strcmp(module_name, "encodings") != 0) && (strcmp(module_name, "encodings.utf_8") != 0) && (strcmp(module_name, "codecs") != 0) &&