]> granicus.if.org Git - python/commitdiff
Fix for SF bug #529050 - ModuleType.__new__ crash.
authorGuido van Rossum <guido@python.org>
Tue, 12 Mar 2002 20:37:02 +0000 (20:37 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 12 Mar 2002 20:37:02 +0000 (20:37 +0000)
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.

Objects/moduleobject.c

index 180f7bc3c72e9b36004d05b89a64495e77cc0e4b..12a35916b5b8a4b59ec19c3d4e2b45792feafb3d 100644 (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;