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); } }