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.
This commit is contained in:
Guido van Rossum 2002-03-12 20:37:02 +00:00
parent 6ccdccd35d
commit cd637aae56
1 changed files with 19 additions and 7 deletions

View File

@ -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;