Index: Modules/posixmodule.c =================================================================== --- Modules/posixmodule.c (revision 67313) +++ Modules/posixmodule.c (working copy) @@ -2087,7 +2087,6 @@ if (PyArg_ParseTuple(args, "U:listdir", &po)) { WIN32_FIND_DATAW wFileData; Py_UNICODE *wnamebuf; - Py_UNICODE wch; /* Overallocate for \\*.*\0 */ len = PyUnicode_GET_SIZE(po); wnamebuf = malloc((len + 5) * sizeof(wchar_t)); @@ -2096,9 +2095,11 @@ return NULL; } wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po)); - wch = len > 0 ? wnamebuf[len-1] : '\0'; - if (wch != L'/' && wch != L'\\' && wch != L':') - wnamebuf[len++] = L'\\'; + if (len > 0) { + Py_UNICODE wch = wnamebuf[len-1]; + if (wch != L'/' && wch != L'\\' && wch != L':') + wnamebuf[len++] = L'\\'; + } wcscpy(wnamebuf + len, L"*.*"); if ((d = PyList_New(0)) == NULL) { free(wnamebuf); Index: Lib/test/test_unicode_file.py =================================================================== --- Lib/test/test_unicode_file.py (revision 67313) +++ Lib/test/test_unicode_file.py (working copy) @@ -161,6 +161,18 @@ TESTFN_UNICODE_UNENCODEABLE+ext, False) + def test_listdir(self): + list1 = os.listdir('') + list2 = os.listdir(b'') + # Most files should be identical, but do not try + # too hard on non-ascii names. + for name1, name2 in zip(list1, list2): + try: + name1 = name1.encode('ascii') + except UnicodeError: + continue + self.assertEqual(name1, name2) + def test_main(): run_unittest(__name__)