diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-03-12 19:52:17 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-12 19:52:17 (GMT) |
commit | aac875fa2f03cab61ceeaa2621c4c5534c7bcfc2 (patch) | |
tree | fa00e616392038d440aa0a550ceee9f270c5716b /Python/bltinmodule.c | |
parent | c60948464fb0ec116ea227f6bce8a4bb8fb75257 (diff) | |
download | cpython-aac875fa2f03cab61ceeaa2621c4c5534c7bcfc2.zip cpython-aac875fa2f03cab61ceeaa2621c4c5534c7bcfc2.tar.gz cpython-aac875fa2f03cab61ceeaa2621c4c5534c7bcfc2.tar.bz2 |
[3.6] bpo-8256: Fixed possible failing or crashing input() (#641)
if attributes "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not strings.
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r-- | Python/bltinmodule.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index ef5a34c..597e26e 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1927,12 +1927,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) @@ -1948,8 +1951,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) @@ -2003,13 +2010,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 */ |