Kaydet (Commit) 588ff93f authored tarafından Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

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
üst 943321d5
...@@ -1471,7 +1471,7 @@ s_init(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -1471,7 +1471,7 @@ s_init(PyObject *self, PyObject *args, PyObject *kwds)
return -1; return -1;
Py_INCREF(o_format); Py_INCREF(o_format);
Py_XDECREF(soself->s_format); Py_CLEAR(soself->s_format);
soself->s_format = o_format; soself->s_format = o_format;
ret = prepare_s(soself); ret = prepare_s(soself);
......
...@@ -575,8 +575,7 @@ newOobject(int size) { ...@@ -575,8 +575,7 @@ newOobject(int size) {
static PyObject * static PyObject *
I_close(Iobject *self, PyObject *unused) { I_close(Iobject *self, PyObject *unused) {
Py_XDECREF(self->pbuf); Py_CLEAR(self->pbuf);
self->pbuf = NULL;
self->buf = NULL; self->buf = NULL;
self->pos = self->string_size = 0; self->pos = self->string_size = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment