Serhiy Storchaka added the comment:

Here are three patches. I think one of them (or any) should fix the issue. The 
question is what solution returns more suitable result for non-ascii key 
names.

----------
keywords: +patch
Added file: 
http://bugs.python.org/file27595/curses_getkey_utf8_surrogateescape.patch
Added file: http://bugs.python.org/file27596/curses_getkey_latin1.patch
Added file: http://bugs.python.org/file27597/curses_getkey_locale.patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue13572>
_______________________________________
diff -r bd3647e9ac62 Modules/_cursesmodule.c
--- a/Modules/_cursesmodule.c   Tue Oct 16 13:52:53 2012 +0300
+++ b/Modules/_cursesmodule.c   Tue Oct 16 21:53:38 2012 +0300
@@ -1144,12 +1144,20 @@
         return Py_BuildValue("C", rtn);
     } else {
         const char *knp;
+        size_t size;
 #if defined(__NetBSD__)
         knp = unctrl(rtn);
 #else
         knp = keyname(rtn);
 #endif
-        return PyUnicode_FromString((knp == NULL) ? "" : knp);
+        if (knp == NULL)
+            return PyUnicode_FromStringAndSize(NULL, 0);
+        size = strlen(knp);
+        if (size > PY_SSIZE_T_MAX) {
+            PyErr_SetString(PyExc_OverflowError, "input too long");
+            return NULL;
+        }
+        return PyUnicode_DecodeUTF8Stateful(knp, (Py_ssize_t)size, 
"surrogateescape", NULL);
     }
 }
 
diff -r bd3647e9ac62 Modules/_cursesmodule.c
--- a/Modules/_cursesmodule.c   Tue Oct 16 13:52:53 2012 +0300
+++ b/Modules/_cursesmodule.c   Tue Oct 16 21:54:08 2012 +0300
@@ -1144,12 +1144,20 @@
         return Py_BuildValue("C", rtn);
     } else {
         const char *knp;
+        size_t size;
 #if defined(__NetBSD__)
         knp = unctrl(rtn);
 #else
         knp = keyname(rtn);
 #endif
-        return PyUnicode_FromString((knp == NULL) ? "" : knp);
+        if (knp == NULL)
+            return PyUnicode_FromStringAndSize(NULL, 0);
+        size = strlen(knp);
+        if (size > PY_SSIZE_T_MAX) {
+            PyErr_SetString(PyExc_OverflowError, "input too long");
+            return NULL;
+        }
+        return PyUnicode_DecodeLatin1(knp, (Py_ssize_t)size, NULL);
     }
 }
 
diff -r bd3647e9ac62 Modules/_cursesmodule.c
--- a/Modules/_cursesmodule.c   Tue Oct 16 13:52:53 2012 +0300
+++ b/Modules/_cursesmodule.c   Tue Oct 16 21:54:40 2012 +0300
@@ -1144,12 +1144,20 @@
         return Py_BuildValue("C", rtn);
     } else {
         const char *knp;
+        size_t size;
 #if defined(__NetBSD__)
         knp = unctrl(rtn);
 #else
         knp = keyname(rtn);
 #endif
-        return PyUnicode_FromString((knp == NULL) ? "" : knp);
+        if (knp == NULL)
+            return PyUnicode_FromStringAndSize(NULL, 0);
+        size = strlen(knp);
+        if (size > PY_SSIZE_T_MAX) {
+            PyErr_SetString(PyExc_OverflowError, "input too long");
+            return NULL;
+        }
+        return PyUnicode_DecodeLocaleAndSize(knp, (Py_ssize_t)size, NULL);
     }
 }
 
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to