summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2002-12-07 02:43:28 (GMT)
committerTim Peters <tim.peters@gmail.com>2002-12-07 02:43:28 (GMT)
commit4e52ca82aec12f911196ca7c452102d10dda5422 (patch)
tree8c4ef894a4bbbda6c78401019fca371404e3ce96
parent61ce0a9bae6e97f25034370eda2fe87ef654e434 (diff)
downloadcpython-4e52ca82aec12f911196ca7c452102d10dda5422.zip
cpython-4e52ca82aec12f911196ca7c452102d10dda5422.tar.gz
cpython-4e52ca82aec12f911196ca7c452102d10dda5422.tar.bz2
A patch from Kevin Jacobs, plugging several leaks discovered when
running the sandbox datetime tests. Bugfix candidate.
-rw-r--r--Modules/cPickle.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index 32fdd6e..b83e765 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -225,10 +225,6 @@ Pdata_popList(Pdata *self, int start)
return r;
}
-#define PDATA_APPEND_(D,O,ER) { \
- if (Pdata_Append(((Pdata*)(D)), O) < 0) return ER; \
-}
-
#define PDATA_APPEND(D,O,ER) { \
if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
Pdata_grow((Pdata*)(D)) < 0) \
@@ -897,6 +893,7 @@ fast_save_enter(Picklerobject *self, PyObject *obj)
if (key == NULL)
return 0;
if (PyDict_GetItem(self->fast_memo, key)) {
+ Py_DECREF(key);
PyErr_Format(PyExc_ValueError,
"fast mode: can't pickle cyclic objects including object type %s at %p",
obj->ob_type->tp_name, obj);
@@ -904,9 +901,11 @@ fast_save_enter(Picklerobject *self, PyObject *obj)
return 0;
}
if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
+ Py_DECREF(key);
self->fast_container = -1;
return 0;
}
+ Py_DECREF(key);
}
return 1;
}
@@ -919,8 +918,10 @@ fast_save_leave(Picklerobject *self, PyObject *obj)
if (key == NULL)
return 0;
if (PyDict_DelItem(self->fast_memo, key) < 0) {
+ Py_DECREF(key);
return 0;
}
+ Py_DECREF(key);
}
return 1;
}
@@ -3115,6 +3116,7 @@ Instance_New(PyObject *cls, PyObject *args)
Py_XDECREF(safe);
return NULL;
}
+ Py_DECREF(safe);
}
if (args==Py_None) {
@@ -3218,7 +3220,10 @@ load_global(Unpicklerobject *self)
if (!module_name) return -1;
if ((len = (*self->readline_func)(self, &s)) >= 0) {
- if (len < 2) return bad_readline();
+ if (len < 2) {
+ Py_DECREF(module_name);
+ return bad_readline();
+ }
if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
class = find_class(module_name, class_name,
self->find_class);