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
This commit is contained in:
parent
943321d586
commit
588ff93f13
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue