Commit d36b17ae authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when

the garbage collector is invoked in other thread.
Based on patch by Sebastian Cufre.
parent 82b7259d
...@@ -315,6 +315,7 @@ Simon Cross ...@@ -315,6 +315,7 @@ Simon Cross
Felipe Cruz Felipe Cruz
Drew Csillag Drew Csillag
Joaquin Cuenca Abela Joaquin Cuenca Abela
Sebastian Cufre
John Cugini John Cugini
Tom Culliton Tom Culliton
Raúl Cumplido Raúl Cumplido
......
...@@ -113,6 +113,10 @@ Core and Builtins ...@@ -113,6 +113,10 @@ Core and Builtins
Library Library
------- -------
- Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when
the garbage collector is invoked in other thread. Based on patch by
Sebastian Cufre.
- Issue #27517: LZMA compressor and decompressor no longer raise exceptions if - Issue #27517: LZMA compressor and decompressor no longer raise exceptions if
given empty data twice. Patch by Benjamin Fogle. given empty data twice. Patch by Benjamin Fogle.
......
...@@ -1103,7 +1103,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, ...@@ -1103,7 +1103,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
} }
static int static int
_textiowrapper_clear(textio *self) textiowrapper_clear(textio *self)
{ {
self->ok = 0; self->ok = 0;
Py_CLEAR(self->buffer); Py_CLEAR(self->buffer);
...@@ -1116,6 +1116,8 @@ _textiowrapper_clear(textio *self) ...@@ -1116,6 +1116,8 @@ _textiowrapper_clear(textio *self)
Py_CLEAR(self->snapshot); Py_CLEAR(self->snapshot);
Py_CLEAR(self->errors); Py_CLEAR(self->errors);
Py_CLEAR(self->raw); Py_CLEAR(self->raw);
Py_CLEAR(self->dict);
return 0; return 0;
} }
...@@ -1125,11 +1127,11 @@ textiowrapper_dealloc(textio *self) ...@@ -1125,11 +1127,11 @@ textiowrapper_dealloc(textio *self)
self->finalizing = 1; self->finalizing = 1;
if (_PyIOBase_finalize((PyObject *) self) < 0) if (_PyIOBase_finalize((PyObject *) self) < 0)
return; return;
_textiowrapper_clear(self); self->ok = 0;
_PyObject_GC_UNTRACK(self); _PyObject_GC_UNTRACK(self);
if (self->weakreflist != NULL) if (self->weakreflist != NULL)
PyObject_ClearWeakRefs((PyObject *)self); PyObject_ClearWeakRefs((PyObject *)self);
Py_CLEAR(self->dict); textiowrapper_clear(self);
Py_TYPE(self)->tp_free((PyObject *)self); Py_TYPE(self)->tp_free((PyObject *)self);
} }
...@@ -1151,15 +1153,6 @@ textiowrapper_traverse(textio *self, visitproc visit, void *arg) ...@@ -1151,15 +1153,6 @@ textiowrapper_traverse(textio *self, visitproc visit, void *arg)
return 0; return 0;
} }
static int
textiowrapper_clear(textio *self)
{
if (_textiowrapper_clear(self) < 0)
return -1;
Py_CLEAR(self->dict);
return 0;
}
static PyObject * static PyObject *
textiowrapper_closed_get(textio *self, void *context); textiowrapper_closed_get(textio *self, void *context);
......
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