diff options
author | Guido van Rossum <guido@python.org> | 2002-03-12 20:37:02 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2002-03-12 20:37:02 (GMT) |
commit | cd637aae5665d40c405a173efd5d9f174e63bf5c (patch) | |
tree | bc953dd4083fe28e325e56921cb73a890a9f0e46 /Objects/moduleobject.c | |
parent | 6ccdccd35d176dd2fa8685f187f257184a95eb97 (diff) | |
download | cpython-cd637aae5665d40c405a173efd5d9f174e63bf5c.zip cpython-cd637aae5665d40c405a173efd5d9f174e63bf5c.tar.gz cpython-cd637aae5665d40c405a173efd5d9f174e63bf5c.tar.bz2 |
Fix for SF bug #529050 - ModuleType.__new__ crash.
There were several places that assumed the md_dict field was always
set, but it needn't be. Fixed these to be more careful.
I changed PyModule_GetDict() to initialize md_dict to a new dictionary
if it's NULL.
Bugfix candidate.
Diffstat (limited to 'Objects/moduleobject.c')
-rw-r--r-- | Objects/moduleobject.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 180f7bc..12a3591 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -43,24 +43,31 @@ PyModule_New(char *name) PyObject * PyModule_GetDict(PyObject *m) { + PyObject *d; if (!PyModule_Check(m)) { PyErr_BadInternalCall(); return NULL; } - return ((PyModuleObject *)m) -> md_dict; + d = ((PyModuleObject *)m) -> md_dict; + if (d == NULL) + ((PyModuleObject *)m) -> md_dict = d = PyDict_New(); + return d; } char * PyModule_GetName(PyObject *m) { + PyObject *d; PyObject *nameobj; if (!PyModule_Check(m)) { PyErr_BadArgument(); return NULL; } - nameobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict, - "__name__"); - if (nameobj == NULL || !PyString_Check(nameobj)) { + d = ((PyModuleObject *)m)->md_dict; + if (d == NULL || + (nameobj = PyDict_GetItemString(d, "__name__")) == NULL || + !PyString_Check(nameobj)) + { PyErr_SetString(PyExc_SystemError, "nameless module"); return NULL; } @@ -70,14 +77,17 @@ PyModule_GetName(PyObject *m) char * PyModule_GetFilename(PyObject *m) { + PyObject *d; PyObject *fileobj; if (!PyModule_Check(m)) { PyErr_BadArgument(); return NULL; } - fileobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict, - "__file__"); - if (fileobj == NULL || !PyString_Check(fileobj)) { + d = ((PyModuleObject *)m)->md_dict; + if (d == NULL || + (fileobj = PyDict_GetItemString(d, "__file__")) == NULL || + !PyString_Check(fileobj)) + { PyErr_SetString(PyExc_SystemError, "module filename missing"); return NULL; } @@ -99,6 +109,8 @@ _PyModule_Clear(PyObject *m) PyObject *d; d = ((PyModuleObject *)m)->md_dict; + if (d == NULL) + return; /* First, clear only names starting with a single underscore */ pos = 0; |