[Python-checkins] cpython (2.7): Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when
serhiy.storchaka
python-checkins at python.org
Thu Nov 3 09:39:24 EDT 2016
https://hg.python.org/cpython/rev/91f024fc9b3a
changeset: 104886:91f024fc9b3a
branch: 2.7
parent: 104883:c0a0abce38f2
user: Serhiy Storchaka <storchaka at gmail.com>
date: Thu Nov 03 15:36:50 2016 +0200
summary:
Issue #28387: Fixed possible crash in _io.TextIOWrapper deallocator when
the garbage collector is invoked in other thread.
Based on patch by Sebastian Cufre.
files:
Misc/ACKS | 1 +
Misc/NEWS | 4 ++++
Modules/_io/textio.c | 15 +++++++--------
3 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -296,6 +296,7 @@
Felipe Cruz
Drew Csillag
Joaquin Cuenca Abela
+Sebastian Cufre
John Cugini
Tom Culliton
Antonio Cuni
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -60,6 +60,10 @@
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 #28449: tarfile.open() with mode "r" or "r:" now tries to open a tar
file with compression before trying to open it without compression. Otherwise
it had 50% chance failed with ignore_zeros=True.
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -1071,11 +1071,9 @@
return -1;
}
-static int
+static void
_textiowrapper_clear(textio *self)
{
- if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
- return -1;
self->ok = 0;
Py_CLEAR(self->buffer);
Py_CLEAR(self->encoding);
@@ -1087,18 +1085,19 @@
Py_CLEAR(self->snapshot);
Py_CLEAR(self->errors);
Py_CLEAR(self->raw);
- return 0;
+
+ Py_CLEAR(self->dict);
}
static void
textiowrapper_dealloc(textio *self)
{
- if (_textiowrapper_clear(self) < 0)
+ if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
return;
_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);
}
@@ -1123,9 +1122,9 @@
static int
textiowrapper_clear(textio *self)
{
- if (_textiowrapper_clear(self) < 0)
+ if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)
return -1;
- Py_CLEAR(self->dict);
+ _textiowrapper_clear(self);
return 0;
}
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list