summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>1998-08-11 19:52:51 +0000
committerJeremy Hylton <jeremy@alum.mit.edu>1998-08-11 19:52:51 +0000
commitd10552379dd85f432545ba3c9199d2b232593f30 (patch)
tree0e9cb3cf6be4674b11b1a1406395aab80379b31e
parent370f3c9eb6fd83038cb171fe45f41065d685a804 (diff)
downloadcpython-git-d10552379dd85f432545ba3c9199d2b232593f30.tar.gz
Two fixes to find_class:
1. Only DECREF the class's module when the module is retrieved via PyImport_Import. If it is retrieved from the modules dictionary with PyDict_GetItem, it is using a borrowed reference. 2. If the module doesn't define the desired class, raise the same SystemError that pickle.py does instead of returning an AttributeError (which is cryptic at best). Also, fix the PyArg_ParseTuple in cpm_loads (the externally visible loads) function: Use "S" instead of "O" because cStringIO will croak with a "bad arguments to internal function" if passed anything other than a string.
-rw-r--r--Modules/cPickle.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index f6e43eefbe..3bb0c1f586 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -1935,15 +1935,28 @@ static PyObject *
find_class(PyObject *py_module_name, PyObject *py_global_name) {
PyObject *global = 0, *module;
- UNLESS(module=PySys_GetObject("modules")) return NULL;
- UNLESS(module=PyDict_GetItem(module, py_module_name)) {
- PyErr_Clear();
- UNLESS(module=PyImport_Import(py_module_name)) return NULL;
- }
-
- global=PyObject_GetAttr(module, py_global_name);
- Py_DECREF(module);
+ module = PySys_GetObject("modules");
+ if (module == NULL)
+ return NULL;
+ module = PyDict_GetItem(module, py_module_name);
+ if (module == NULL) {
+ module = PyImport_Import(py_module_name);
+ if (!module)
+ return NULL;
+ global = PyObject_GetAttr(module, py_global_name);
+ Py_DECREF(module);
+ }
+ else
+ global = PyObject_GetAttr(module, py_global_name);
+ if (global == NULL) {
+ char buf[256 + 37];
+ sprintf(buf, "Failed to import class %.128s from moduile %.128s",
+ PyString_AS_STRING(py_global_name),
+ PyString_AS_STRING(py_module_name));
+ PyErr_SetString(PyExc_SystemError, buf);
+ return NULL;
+ }
return global;
}
@@ -4093,7 +4106,7 @@ cpm_loads(PyObject *self, PyObject *args) {
PyObject *ob, *file = 0, *res = NULL;
Unpicklerobject *unpickler = 0;
- UNLESS(PyArg_ParseTuple(args, "O", &ob))
+ UNLESS(PyArg_ParseTuple(args, "S", &ob))
goto finally;
UNLESS(file = PycStringIO->NewInput(ob))