Do more robust test of whether global objects are accessible.

PyImport_ImportModule() is not guaranteed to return a module object.
When another type of object was returned, the PyModule_GetDict() call
return NULL and the subsequent GetItem() seg faulted.

Bug fix candidate.
This commit is contained in:
Jeremy Hylton 2002-07-11 22:01:40 +00:00
parent f2a0473350
commit 0e1f7a82e9
1 changed files with 3 additions and 4 deletions

View File

@ -1719,10 +1719,7 @@ save_global(Picklerobject *self, PyObject *args, PyObject *name)
"OSS", args, module, global_name);
goto finally;
}
/* borrowed ref */
moddict = PyModule_GetDict(mod);
/* borrowed ref */
klass = PyDict_GetItemString(moddict, name_str);
klass = PyObject_GetAttrString(mod, name_str);
if (klass == NULL) {
cPickle_ErrFormat(PicklingError,
"Can't pickle %s: it's not found as %s.%s",
@ -1730,11 +1727,13 @@ save_global(Picklerobject *self, PyObject *args, PyObject *name)
goto finally;
}
if (klass != args) {
Py_DECREF(klass);
cPickle_ErrFormat(PicklingError,
"Can't pickle %s: it's not the same object as %s.%s",
"OSS", args, module, global_name);
goto finally;
}
Py_DECREF(klass);
if ((*self->write_func)(self, &global, 1) < 0)
goto finally;