Skip to content

Commit 654ebda

Browse files
author
gvanrossum
committed
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. git-svn-id: http://svn.python.org/projects/python/trunk@25615 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent d340660 commit 654ebda

1 file changed

Lines changed: 19 additions & 7 deletions

File tree

Objects/moduleobject.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,31 @@ PyModule_New(char *name)
4343
PyObject *
4444
PyModule_GetDict(PyObject *m)
4545
{
46+
PyObject *d;
4647
if (!PyModule_Check(m)) {
4748
PyErr_BadInternalCall();
4849
return NULL;
4950
}
50-
return ((PyModuleObject *)m) -> md_dict;
51+
d = ((PyModuleObject *)m) -> md_dict;
52+
if (d == NULL)
53+
((PyModuleObject *)m) -> md_dict = d = PyDict_New();
54+
return d;
5155
}
5256

5357
char *
5458
PyModule_GetName(PyObject *m)
5559
{
60+
PyObject *d;
5661
PyObject *nameobj;
5762
if (!PyModule_Check(m)) {
5863
PyErr_BadArgument();
5964
return NULL;
6065
}
61-
nameobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
62-
"__name__");
63-
if (nameobj == NULL || !PyString_Check(nameobj)) {
66+
d = ((PyModuleObject *)m)->md_dict;
67+
if (d == NULL ||
68+
(nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
69+
!PyString_Check(nameobj))
70+
{
6471
PyErr_SetString(PyExc_SystemError, "nameless module");
6572
return NULL;
6673
}
@@ -70,14 +77,17 @@ PyModule_GetName(PyObject *m)
7077
char *
7178
PyModule_GetFilename(PyObject *m)
7279
{
80+
PyObject *d;
7381
PyObject *fileobj;
7482
if (!PyModule_Check(m)) {
7583
PyErr_BadArgument();
7684
return NULL;
7785
}
78-
fileobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
79-
"__file__");
80-
if (fileobj == NULL || !PyString_Check(fileobj)) {
86+
d = ((PyModuleObject *)m)->md_dict;
87+
if (d == NULL ||
88+
(fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
89+
!PyString_Check(fileobj))
90+
{
8191
PyErr_SetString(PyExc_SystemError, "module filename missing");
8292
return NULL;
8393
}
@@ -99,6 +109,8 @@ _PyModule_Clear(PyObject *m)
99109
PyObject *d;
100110

101111
d = ((PyModuleObject *)m)->md_dict;
112+
if (d == NULL)
113+
return;
102114

103115
/* First, clear only names starting with a single underscore */
104116
pos = 0;

0 commit comments

Comments
 (0)