mirror of
https://github.com/python/cpython.git
synced 2024-11-27 11:55:13 +08:00
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:
parent
4dadcd4ed7
commit
c2cf128571
@ -278,6 +278,9 @@ Extension Modules
|
||||
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
|
||||
now deprecated.
|
||||
|
||||
|
@ -1926,12 +1926,15 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
|
||||
PyObject *result;
|
||||
size_t len;
|
||||
|
||||
/* stdin is a text stream, so it must have an encoding. */
|
||||
stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding);
|
||||
stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors);
|
||||
if (!stdin_encoding || !stdin_errors)
|
||||
/* stdin is a text stream, so it must have an
|
||||
encoding. */
|
||||
if (!stdin_encoding || !stdin_errors ||
|
||||
!PyUnicode_Check(stdin_encoding) ||
|
||||
!PyUnicode_Check(stdin_errors)) {
|
||||
tty = 0;
|
||||
goto _readline_errors;
|
||||
}
|
||||
stdin_encoding_str = PyUnicode_AsUTF8(stdin_encoding);
|
||||
stdin_errors_str = PyUnicode_AsUTF8(stdin_errors);
|
||||
if (!stdin_encoding_str || !stdin_errors_str)
|
||||
@ -1947,8 +1950,12 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
|
||||
PyObject *stringpo;
|
||||
stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding);
|
||||
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;
|
||||
}
|
||||
stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding);
|
||||
stdout_errors_str = PyUnicode_AsUTF8(stdout_errors);
|
||||
if (!stdout_encoding_str || !stdout_errors_str)
|
||||
@ -2002,13 +2009,17 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
|
||||
Py_XDECREF(po);
|
||||
PyMem_FREE(s);
|
||||
return result;
|
||||
|
||||
_readline_errors:
|
||||
Py_XDECREF(stdin_encoding);
|
||||
Py_XDECREF(stdout_encoding);
|
||||
Py_XDECREF(stdin_errors);
|
||||
Py_XDECREF(stdout_errors);
|
||||
Py_XDECREF(po);
|
||||
return NULL;
|
||||
if (tty)
|
||||
return NULL;
|
||||
|
||||
PyErr_Clear();
|
||||
}
|
||||
|
||||
/* Fallback if we're not interactive */
|
||||
|
Loading…
Reference in New Issue
Block a user