bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. (#514)

This commit is contained in:
Serhiy Storchaka 2017-03-19 19:25:29 +02:00 committed by GitHub
parent 77ed11552d
commit a5af6e1af7
6 changed files with 74 additions and 9 deletions

View file

@ -1415,8 +1415,18 @@ buffered_repr(buffered *self)
res = PyUnicode_FromFormat("<%s>", Py_TYPE(self)->tp_name);
}
else {
res = PyUnicode_FromFormat("<%s name=%R>",
Py_TYPE(self)->tp_name, nameobj);
int status = Py_ReprEnter((PyObject *)self);
res = NULL;
if (status == 0) {
res = PyUnicode_FromFormat("<%s name=%R>",
Py_TYPE(self)->tp_name, nameobj);
Py_ReprLeave((PyObject *)self);
}
else if (status > 0) {
PyErr_Format(PyExc_RuntimeError,
"reentrant call inside %s.__repr__",
Py_TYPE(self)->tp_name);
}
Py_DECREF(nameobj);
}
return res;

View file

@ -1082,9 +1082,19 @@ fileio_repr(fileio *self)
self->fd, mode_string(self), self->closefd ? "True" : "False");
}
else {
res = PyUnicode_FromFormat(
"<_io.FileIO name=%R mode='%s' closefd=%s>",
nameobj, mode_string(self), self->closefd ? "True" : "False");
int status = Py_ReprEnter((PyObject *)self);
res = NULL;
if (status == 0) {
res = PyUnicode_FromFormat(
"<_io.FileIO name=%R mode='%s' closefd=%s>",
nameobj, mode_string(self), self->closefd ? "True" : "False");
Py_ReprLeave((PyObject *)self);
}
else if (status > 0) {
PyErr_Format(PyExc_RuntimeError,
"reentrant call inside %s.__repr__",
Py_TYPE(self)->tp_name);
}
Py_DECREF(nameobj);
}
return res;

View file

@ -2483,6 +2483,7 @@ static PyObject *
textiowrapper_repr(textio *self)
{
PyObject *nameobj, *modeobj, *res, *s;
int status;
CHECK_INITIALIZED(self);
@ -2490,6 +2491,15 @@ textiowrapper_repr(textio *self)
if (res == NULL)
return NULL;
status = Py_ReprEnter((PyObject *)self);
if (status != 0) {
if (status > 0) {
PyErr_Format(PyExc_RuntimeError,
"reentrant call inside %s.__repr__",
Py_TYPE(self)->tp_name);
}
goto error;
}
nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
if (nameobj == NULL) {
if (PyErr_ExceptionMatches(PyExc_Exception))
@ -2504,7 +2514,7 @@ textiowrapper_repr(textio *self)
goto error;
PyUnicode_AppendAndDel(&res, s);
if (res == NULL)
return NULL;
goto error;
}
modeobj = _PyObject_GetAttrId((PyObject *) self, &PyId_mode);
if (modeobj == NULL) {
@ -2520,14 +2530,21 @@ textiowrapper_repr(textio *self)
goto error;
PyUnicode_AppendAndDel(&res, s);
if (res == NULL)
return NULL;
goto error;
}
s = PyUnicode_FromFormat("%U encoding=%R>",
res, self->encoding);
Py_DECREF(res);
if (status == 0) {
Py_ReprLeave((PyObject *)self);
}
return s;
error:
error:
Py_XDECREF(res);
if (status == 0) {
Py_ReprLeave((PyObject *)self);
}
return NULL;
}