]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
A patch from Kevin Jacobs, plugging several leaks discovered when
authorTim Peters <tim.peters@gmail.com>
Sat, 7 Dec 2002 02:43:28 +0000 (02:43 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 7 Dec 2002 02:43:28 +0000 (02:43 +0000)
running the sandbox datetime tests.

Bugfix candidate.

Modules/cPickle.c

index 32fdd6ed76860abce93ae9cdc9aae9fb2869d254..b83e76581a629e409fd7e03f786de239791297e1 100644 (file)
@@ -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);