Issue 1342: Python could not start if installed in a directory

with non-ascii characters.

This is the simple fix, which uses the FileSystemEncoding.
Replacing all the char* with unicode strings is a major rewrite,
and needs more thinking.
This commit is contained in:
Amaury Forgeot d'Arc 2008-06-11 17:40:47 +00:00
parent c354c2e6ef
commit f1ca0b11b5
3 changed files with 15 additions and 5 deletions

View File

@ -12,6 +12,9 @@ What's new in Python 3.0b1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #1342: On windows, Python could not start when installed in a
directory with non-ascii characters.
- Implement PEP 3121: new module initialization and finalization API. - Implement PEP 3121: new module initialization and finalization API.
- Removed the already-defunct ``-t`` option. - Removed the already-defunct ``-t`` option.

View File

@ -1364,19 +1364,26 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
if (!v) if (!v)
return NULL; return NULL;
if (PyUnicode_Check(v)) { if (PyUnicode_Check(v)) {
v = _PyUnicode_AsDefaultEncodedString(v, NULL); v = PyUnicode_AsEncodedString(v,
Py_FileSystemDefaultEncoding, NULL);
if (v == NULL) if (v == NULL)
return NULL; return NULL;
} }
if (!PyBytes_Check(v)) else if (!PyBytes_Check(v))
continue; continue;
else
Py_INCREF(v);
base = PyBytes_AS_STRING(v); base = PyBytes_AS_STRING(v);
size = PyBytes_GET_SIZE(v); size = PyBytes_GET_SIZE(v);
len = size; len = size;
if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) { if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
Py_DECREF(v);
continue; /* Too long */ continue; /* Too long */
} }
strcpy(buf, base); strcpy(buf, base);
Py_DECREF(v);
if (strlen(buf) != len) { if (strlen(buf) != len) {
continue; /* v contains '\0' */ continue; /* v contains '\0' */
} }
@ -3155,8 +3162,8 @@ NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
if (!_PyArg_NoKeywords("NullImporter()", kwds)) if (!_PyArg_NoKeywords("NullImporter()", kwds))
return -1; return -1;
if (!PyArg_ParseTuple(args, "s:NullImporter", if (!PyArg_ParseTuple(args, "es:NullImporter",
&path)) Py_FileSystemDefaultEncoding, &path))
return -1; return -1;
pathlen = strlen(path); pathlen = strlen(path);

View File

@ -695,7 +695,7 @@ initstdio(void)
PyObject *std = NULL; PyObject *std = NULL;
int status = 0, fd; int status = 0, fd;
PyObject * encoding_attr; PyObject * encoding_attr;
char *encoding, *errors; char *encoding = NULL, *errors;
/* Hack to avoid a nasty recursion issue when Python is invoked /* Hack to avoid a nasty recursion issue when Python is invoked
in verbose mode: pre-import the Latin-1 and UTF-8 codecs */ in verbose mode: pre-import the Latin-1 and UTF-8 codecs */