From 5877bc3dfd77533585dfd341b34897722ba1bf6e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sun, 22 Sep 2002 08:21:45 +0000 Subject: [PATCH] Add recursion limit to pickling. Fixes #576084. --- Modules/cPickle.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Modules/cPickle.c b/Modules/cPickle.c index 1f8b210ede4f..a400ddefdeac 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -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; -- 2.47.3