mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. (#514)
This commit is contained in:
parent
77ed11552d
commit
a5af6e1af7
6 changed files with 74 additions and 9 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue