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