From 5894ba7fad07dbf07ac76aedf0fb2f70fb42d40e Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Sun, 4 Nov 2007 11:43:14 +0000 Subject: Fixed a bug in PyUnicode_DecodeFSDefault. strcmp() returns 0 on success. Added PyUnicode_DecodeFSDefaultAndSize Fixed a problem with the sys.path code that caused a segfault on Windows when the path contains non ASCII chars. The code for sys.executable, exec_prefix and prefix should be fixed, too. --- Include/unicodeobject.h | 8 ++++++++ Objects/unicodeobject.c | 12 ++++++++---- Python/sysmodule.c | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 3ef354f..203dcef 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -155,6 +155,7 @@ typedef PY_UNICODE_TYPE Py_UNICODE; # define PyUnicode_DecodeCharmap PyUnicodeUCS2_DecodeCharmap # define PyUnicode_DecodeLatin1 PyUnicodeUCS2_DecodeLatin1 # define PyUnicode_DecodeFSDefault PyUnicodeUCS2_DecodeFSDefault +# define PyUnicode_DecodeFSDefaultAndSize PyUnicodeUCS2_DecodeFSDefaultAndSize # define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS2_DecodeRawUnicodeEscape # define PyUnicode_DecodeUTF32 PyUnicodeUCS2_DecodeUTF32 # define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS2_DecodeUTF32Stateful @@ -247,6 +248,7 @@ typedef PY_UNICODE_TYPE Py_UNICODE; # define PyUnicode_DecodeCharmap PyUnicodeUCS4_DecodeCharmap # define PyUnicode_DecodeLatin1 PyUnicodeUCS4_DecodeLatin1 # define PyUnicode_DecodeFSDefault PyUnicodeUCS4_DecodeFSDefault +# define PyUnicode_DecodeFSDefaultAndSize PyUnicodeUCS4_DecodeFSDefaultAndSize # define PyUnicode_DecodeRawUnicodeEscape PyUnicodeUCS4_DecodeRawUnicodeEscape # define PyUnicode_DecodeUTF32 PyUnicodeUCS4_DecodeUTF32 # define PyUnicode_DecodeUTF32Stateful PyUnicodeUCS4_DecodeUTF32Stateful @@ -657,6 +659,12 @@ PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefault( const char *s /* encoded string */ ); +PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefaultAndSize( + const char *s, /* encoded string */ + Py_ssize_t size /* size */ + ); + + /* Return a char* holding the UTF-8 encoded value of the Unicode object. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 23268f9..c568a8e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1263,10 +1263,14 @@ PyObject *_PyUnicode_AsDefaultEncodedString(PyObject *unicode, } PyObject* -PyUnicode_DecodeFSDefault(const char *s) -{ +PyUnicode_DecodeFSDefault(const char *s) { Py_ssize_t size = (Py_ssize_t)strlen(s); + return PyUnicode_DecodeFSDefaultAndSize(s, size); +} +PyObject* +PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) +{ /* During the early bootstrapping process, Py_FileSystemDefaultEncoding can be undefined. If it is case, decode using UTF-8. The following assumes that Py_FileSystemDefaultEncoding is set to a built-in encoding during the @@ -1274,11 +1278,11 @@ PyUnicode_DecodeFSDefault(const char *s) */ if (Py_FileSystemDefaultEncoding) { #if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T) - if (strcmp(Py_FileSystemDefaultEncoding, "mbcs")) { + if (strcmp(Py_FileSystemDefaultEncoding, "mbcs") == 0) { return PyUnicode_DecodeMBCS(s, size, "replace"); } #elif defined(__APPLE__) - if (strcmp(Py_FileSystemDefaultEncoding, "utf-8")) { + if (strcmp(Py_FileSystemDefaultEncoding, "utf-8") == 0) { return PyUnicode_DecodeUTF8(s, size, "replace"); } #endif diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 13e0a99..d140fe3 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1150,7 +1150,7 @@ makepathobject(const char *path, int delim) p = strchr(path, delim); if (p == NULL) p = strchr(path, '\0'); /* End of string */ - w = PyUnicode_FromStringAndSize(path, (Py_ssize_t) (p - path)); + w = PyUnicode_DecodeFSDefaultAndSize(path, (Py_ssize_t) (p - path)); if (w == NULL) { Py_DECREF(v); return NULL; -- cgit v0.12