From 588ff93f1383436694e26c962528291913012296 Mon Sep 17 00:00:00 2001 From: Amaury Forgeot d'Arc Date: Sat, 16 Feb 2008 14:34:57 +0000 Subject: Crashers of the day: Py_CLEAR must be used when there is a chance that the function can be called recursively. This was discussed in issue1020188. In python codebase, all occurrences of Py_[X]DECREF(xxx->yyy) are suspect, except when they appear in tp_new or tp_dealloc functions, or when the member cannot be of a user-defined class. Note that tp_init is not safe. I do have a (crashing) example for every changed line. Is it worth adding them to the test suite? Example: class SpecialStr(str): def __del__(self): s.close() import cStringIO s = cStringIO.StringIO(SpecialStr("text")) s.close() # Segfault --- Modules/_struct.c | 2 +- Modules/cStringIO.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/_struct.c b/Modules/_struct.c index 6149964..8e5420c 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1471,7 +1471,7 @@ s_init(PyObject *self, PyObject *args, PyObject *kwds) return -1; Py_INCREF(o_format); - Py_XDECREF(soself->s_format); + Py_CLEAR(soself->s_format); soself->s_format = o_format; ret = prepare_s(soself); diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c index 3529047..139a4a8 100644 --- a/Modules/cStringIO.c +++ b/Modules/cStringIO.c @@ -575,8 +575,7 @@ newOobject(int size) { static PyObject * I_close(Iobject *self, PyObject *unused) { - Py_XDECREF(self->pbuf); - self->pbuf = NULL; + Py_CLEAR(self->pbuf); self->buf = NULL; self->pos = self->string_size = 0; -- cgit v0.12