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

the garbage collector is invoked in other thread.
Based on patch by Sebastian Cufre.
This commit is contained in:
Serhiy Storchaka 2016-11-03 15:37:01 +02:00
parent 2af4144b7f
commit a7c972e03b
3 changed files with 10 additions and 12 deletions

View file

@ -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

View file

@ -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.

View file

@ -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)
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)
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)
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);