]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add recursion limit to pickling. Fixes #576084.
authorMartin v. Löwis <martin@v.loewis.de>
Sun, 22 Sep 2002 08:21:45 +0000 (08:21 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sun, 22 Sep 2002 08:21:45 +0000 (08:21 +0000)
Modules/cPickle.c

index 1f8b210ede4f12f7d9713a00a53996c0e2de0763..a400ddefdeac0d711b13d1f871fc743555f64ec5 100644 (file)
@@ -313,6 +313,7 @@ typedef struct Picklerobject {
     PyObject *inst_pers_func;
     int bin;
     int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
+    int nesting;
     int (*write_func)(struct Picklerobject *, char *, int);
     char *write_buf;
     int buf_size;
@@ -1850,6 +1851,12 @@ save(Picklerobject *self, PyObject *args, int  pers_save) {
              *callable = 0, *state = 0;
     int res = -1, tmp, size;
 
+    if (self->nesting++ > Py_GetRecursionLimit()){
+           PyErr_SetString(PyExc_RuntimeError,
+                           "maximum recursion depth exceeded");
+           goto finally;
+    }
+
     if (!pers_save && self->pers_func) {
         if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
             res = tmp;
@@ -2068,6 +2075,7 @@ save(Picklerobject *self, PyObject *args, int  pers_save) {
     PyErr_SetObject(UnpickleableError, args);
 
 finally:
+    self->nesting--;
     Py_XDECREF(py_ob_id);
     Py_XDECREF(__reduce__);
     Py_XDECREF(t);
@@ -2287,6 +2295,7 @@ newPicklerobject(PyObject *file, int bin) {
     self->write_buf = NULL;
     self->bin = bin;
     self->fast = 0;
+    self->nesting = 0;
     self->fast_container = 0;
     self->fast_memo = NULL;
     self->buf_size = 0;