From: Michael W. Hudson Date: Tue, 24 Sep 2002 11:53:34 +0000 (+0000) Subject: backport jhylton's checkin of X-Git-Tag: v2.2.2b1~135 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ed9bb76950cc233caaea74b81a80ce188402fc74;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Modules/cPickle.c b/Modules/cPickle.c index a400ddefdeac..ae2df8c21af1 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -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;