From dff1834f4540ac3c821e474de3a15293cfc728a9 Mon Sep 17 00:00:00 2001 From: Alexandre Vassalotti Date: Sun, 13 Jul 2008 18:48:30 +0000 Subject: [PATCH] Fixed _pickle to use Py_EnterRecursiveCall(). --- Modules/_pickle.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Modules/_pickle.c b/Modules/_pickle.c index d015bafebeb..98cb62e1ed0 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -304,9 +304,6 @@ typedef struct PicklerObject { PyObject *arg; int proto; /* Pickle protocol number, >= 0 */ int bin; /* Boolean, true if proto > 0 */ - int nesting; /* Current nesting level, this is to guard - save() from going into infinite recursion - and segfaulting. */ int buf_size; /* Size of the current buffered pickle data */ char *write_buf; /* Write buffer, this is to avoid calling the write() method of the output stream too @@ -2075,12 +2072,8 @@ save(PicklerObject *self, PyObject *obj, int pers_save) PyObject *memo_key = NULL; int status = 0; - /* XXX: Use Py_EnterRecursiveCall()? */ - if (++self->nesting > Py_GetRecursionLimit()) { - PyErr_SetString(PyExc_RuntimeError, - "maximum recursion depth exceeded"); - goto error; - } + if (Py_EnterRecursiveCall(" while pickling an object") < 0) + return -1; /* The extra pers_save argument is necessary to avoid calling save_pers() on its returned object. */ @@ -2273,7 +2266,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) status = -1; } done: - self->nesting--; + Py_LeaveRecursiveCall(); Py_XDECREF(memo_key); Py_XDECREF(reduce_func); Py_XDECREF(reduce_value); @@ -2440,7 +2433,6 @@ Pickler_init(PicklerObject *self, PyObject *args, PyObject *kwds) self->proto = proto; self->bin = proto > 0; self->arg = NULL; - self->nesting = 0; self->fast = 0; self->fast_nesting = 0; self->fast_memo = NULL;