Kaydet (Commit) ed9bb769 authored tarafından Michael W. Hudson's avatar Michael W. Hudson

backport jhylton's checkin of

    revision 2.87 of cPickle.c

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.

----------

Once again, whitespace chances scuppered automatic backporting, so
I did this by hand.  Review probably wise -- but I have run make test!

Also incorporates revision 2.88 which was just removing a now unused
declaration.
üst 070fe168
......@@ -1674,7 +1674,7 @@ finally:
static int
save_global(Picklerobject *self, PyObject *args, PyObject *name) {
PyObject *global_name = 0, *module = 0, *mod = 0, *moddict = 0, *klass = 0;
PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
char *name_str, *module_str;
int module_size, name_size, res = -1;
......@@ -1707,8 +1707,7 @@ save_global(Picklerobject *self, PyObject *args, PyObject *name) {
"OSS", args, module, global_name);
goto finally;
}
moddict = PyModule_GetDict(mod); /* borrowed ref */
klass = PyDict_GetItemString(moddict, name_str); /* borrowed ref */
klass = PyObject_GetAttrString(mod, name_str);
if (klass == NULL) {
cPickle_ErrFormat(PicklingError,
"Can't pickle %s: it's not found as %s.%s",
......@@ -1716,11 +1715,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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment