]> granicus.if.org Git - python/commitdiff
Issue #6697: Fix a crash if sys.stdin or sys.stdout encoding contain a surrogate
authorVictor Stinner <victor.stinner@haypocalc.com>
Wed, 19 May 2010 01:06:22 +0000 (01:06 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Wed, 19 May 2010 01:06:22 +0000 (01:06 +0000)
This is *very* unlikely :-)

Python/bltinmodule.c

index a658f9b9683fe0dae64f44cf9fa61e78a5bf4ec3..e1f2931dbc2952f82676f2fb3c07d061ab752738 100644 (file)
@@ -1610,6 +1610,7 @@ builtin_input(PyObject *self, PyObject *args)
         char *prompt;
         char *s;
         PyObject *stdin_encoding;
+        char *stdin_encoding_str;
         PyObject *result;
 
         stdin_encoding = PyObject_GetAttrString(fin, "encoding");
@@ -1617,6 +1618,11 @@ builtin_input(PyObject *self, PyObject *args)
             /* stdin is a text stream, so it must have an
                encoding. */
             return NULL;
+        stdin_encoding_str = _PyUnicode_AsString(stdin_encoding);
+        if (stdin_encoding_str  == NULL) {
+            Py_DECREF(stdin_encoding);
+            return NULL;
+        }
         tmp = PyObject_CallMethod(fout, "flush", "");
         if (tmp == NULL)
             PyErr_Clear();
@@ -1625,12 +1631,18 @@ builtin_input(PyObject *self, PyObject *args)
         if (promptarg != NULL) {
             PyObject *stringpo;
             PyObject *stdout_encoding;
-            stdout_encoding = PyObject_GetAttrString(fout,
-                                                     "encoding");
+            char *stdout_encoding_str;
+            stdout_encoding = PyObject_GetAttrString(fout, "encoding");
             if (stdout_encoding == NULL) {
                 Py_DECREF(stdin_encoding);
                 return NULL;
             }
+            stdout_encoding_str = _PyUnicode_AsString(stdout_encoding);
+            if (stdout_encoding_str == NULL) {
+                Py_DECREF(stdin_encoding);
+                Py_DECREF(stdout_encoding);
+                return NULL;
+            }
             stringpo = PyObject_Str(promptarg);
             if (stringpo == NULL) {
                 Py_DECREF(stdin_encoding);
@@ -1638,7 +1650,7 @@ builtin_input(PyObject *self, PyObject *args)
                 return NULL;
             }
             po = PyUnicode_AsEncodedString(stringpo,
-                _PyUnicode_AsString(stdout_encoding), NULL);
+                stdout_encoding_str, NULL);
             Py_DECREF(stdout_encoding);
             Py_DECREF(stringpo);
             if (po == NULL) {
@@ -1676,10 +1688,7 @@ builtin_input(PyObject *self, PyObject *args)
                 result = NULL;
             }
             else {
-                result = PyUnicode_Decode
-                    (s, len-1,
-                     _PyUnicode_AsString(stdin_encoding),
-                     NULL);
+                result = PyUnicode_Decode(s, len-1, stdin_encoding_str, NULL);
             }
         }
         Py_DECREF(stdin_encoding);