diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-11-03 13:38:17 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-11-03 13:38:17 (GMT) |
commit | 5f548a24a48838bc9922527e33bbec955483c13c (patch) | |
tree | 4972904d6d54012f64647a868933e6091c494e56 /Modules | |
parent | c96b8fcf251dfd833411188fe564475942269012 (diff) | |
parent | a7c972e03b03d3e5c5d1cea78ff73002aa7786b4 (diff) | |
download | cpython-5f548a24a48838bc9922527e33bbec955483c13c.zip cpython-5f548a24a48838bc9922527e33bbec955483c13c.tar.gz cpython-5f548a24a48838bc9922527e33bbec955483c13c.tar.bz2 |
Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when
the garbage collector is invoked in other thread.
Based on patch by Sebastian Cufre.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_io/textio.c | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 508e46e..dca4ea9 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -1103,7 +1103,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, } static int -_textiowrapper_clear(textio *self) +textiowrapper_clear(textio *self) { self->ok = 0; Py_CLEAR(self->buffer); @@ -1116,6 +1116,8 @@ _textiowrapper_clear(textio *self) Py_CLEAR(self->snapshot); Py_CLEAR(self->errors); Py_CLEAR(self->raw); + + Py_CLEAR(self->dict); return 0; } @@ -1125,11 +1127,11 @@ textiowrapper_dealloc(textio *self) self->finalizing = 1; if (_PyIOBase_finalize((PyObject *) self) < 0) return; - _textiowrapper_clear(self); + self->ok = 0; _PyObject_GC_UNTRACK(self); if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *)self); - Py_CLEAR(self->dict); + textiowrapper_clear(self); Py_TYPE(self)->tp_free((PyObject *)self); } @@ -1151,15 +1153,6 @@ textiowrapper_traverse(textio *self, visitproc visit, void *arg) return 0; } -static int -textiowrapper_clear(textio *self) -{ - if (_textiowrapper_clear(self) < 0) - return -1; - Py_CLEAR(self->dict); - return 0; -} - static PyObject * textiowrapper_closed_get(textio *self, void *context); |