Kaydet (Commit) 5f548a24 authored tarafından 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.
...@@ -321,6 +321,7 @@ Felipe Cruz ...@@ -321,6 +321,7 @@ Felipe Cruz
Drew Csillag Drew Csillag
Alessandro Cucci Alessandro Cucci
Joaquin Cuenca Abela Joaquin Cuenca Abela
Sebastian Cufre
John Cugini John Cugini
Tom Culliton Tom Culliton
Raúl Cumplido Raúl Cumplido
......
...@@ -16,6 +16,10 @@ Core and Builtins ...@@ -16,6 +16,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.
Documentation Documentation
------------- -------------
......
...@@ -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