summaryrefslogtreecommitdiffstats
path: root/Python/bltinmodule.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-03-12 19:52:17 (GMT)
committerGitHub <noreply@github.com>2017-03-12 19:52:17 (GMT)
commitaac875fa2f03cab61ceeaa2621c4c5534c7bcfc2 (patch)
treefa00e616392038d440aa0a550ceee9f270c5716b /Python/bltinmodule.c
parentc60948464fb0ec116ea227f6bce8a4bb8fb75257 (diff)
downloadcpython-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.c21
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 */