bpo-8256: Fixed possible failing or crashing input() (#517)

if attributes "encoding" or "errors" of sys.stdin or sys.stdout
are not set or are not strings.
This commit is contained in:
Serhiy Storchaka 2017-03-12 13:50:36 +02:00 committed by GitHub
parent 4dadcd4ed7
commit c2cf128571
2 changed files with 19 additions and 5 deletions

View File

@ -278,6 +278,9 @@ Extension Modules
Library Library
------- -------
- bpo-8256: Fixed possible failing or crashing input() if attributes "encoding"
or "errors" of sys.stdin or sys.stdout are not set or are not strings.
- bpo-28692: Using non-integer value for selecting a plural form in gettext is - bpo-28692: Using non-integer value for selecting a plural form in gettext is
now deprecated. now deprecated.

View File

@ -1926,12 +1926,15 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
PyObject *result; PyObject *result;
size_t len; size_t len;
/* stdin is a text stream, so it must have an encoding. */
stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding); stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding);
stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors); stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors);
if (!stdin_encoding || !stdin_errors) if (!stdin_encoding || !stdin_errors ||
/* stdin is a text stream, so it must have an !PyUnicode_Check(stdin_encoding) ||
encoding. */ !PyUnicode_Check(stdin_errors)) {
tty = 0;
goto _readline_errors; goto _readline_errors;
}
stdin_encoding_str = PyUnicode_AsUTF8(stdin_encoding); stdin_encoding_str = PyUnicode_AsUTF8(stdin_encoding);
stdin_errors_str = PyUnicode_AsUTF8(stdin_errors); stdin_errors_str = PyUnicode_AsUTF8(stdin_errors);
if (!stdin_encoding_str || !stdin_errors_str) if (!stdin_encoding_str || !stdin_errors_str)
@ -1947,8 +1950,12 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
PyObject *stringpo; PyObject *stringpo;
stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding); stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding);
stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors); stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors);
if (!stdout_encoding || !stdout_errors) if (!stdout_encoding || !stdout_errors ||
!PyUnicode_Check(stdout_encoding) ||
!PyUnicode_Check(stdout_errors)) {
tty = 0;
goto _readline_errors; goto _readline_errors;
}
stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding); stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding);
stdout_errors_str = PyUnicode_AsUTF8(stdout_errors); stdout_errors_str = PyUnicode_AsUTF8(stdout_errors);
if (!stdout_encoding_str || !stdout_errors_str) if (!stdout_encoding_str || !stdout_errors_str)
@ -2002,13 +2009,17 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
Py_XDECREF(po); Py_XDECREF(po);
PyMem_FREE(s); PyMem_FREE(s);
return result; return result;
_readline_errors: _readline_errors:
Py_XDECREF(stdin_encoding); Py_XDECREF(stdin_encoding);
Py_XDECREF(stdout_encoding); Py_XDECREF(stdout_encoding);
Py_XDECREF(stdin_errors); Py_XDECREF(stdin_errors);
Py_XDECREF(stdout_errors); Py_XDECREF(stdout_errors);
Py_XDECREF(po); Py_XDECREF(po);
return NULL; if (tty)
return NULL;
PyErr_Clear();
} }
/* Fallback if we're not interactive */ /* Fallback if we're not interactive */