]> granicus.if.org Git - python/commitdiff
bpo-8256: Fixed possible failing or crashing input() (#517)
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 12 Mar 2017 11:50:36 +0000 (13:50 +0200)
committerGitHub <noreply@github.com>
Sun, 12 Mar 2017 11:50:36 +0000 (13:50 +0200)
if attributes "encoding" or "errors" of sys.stdin or sys.stdout
are not set or are not strings.

Misc/NEWS
Python/bltinmodule.c

index d80674c28523948e0a3ab1d1a805b02d1556039e..2872aa1fe70b751b24728d0c25c053b9e487ef61 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
 
index 62463afc275bfe6274b12356b5efbb0014077ca9..8ae2303e98d3335504bdde738045401fce031c4e 100644 (file)
@@ -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 */