diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2012-11-12 22:32:21 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2012-11-12 22:32:21 (GMT) |
commit | 0d92c4f667518c7a24abda885e10c0c8e72cae57 (patch) | |
tree | a09b16eefaea36ba494d205dde4050f346d2a1fc /Python | |
parent | fc93ec5966f67b94cd46c3b8ab6400a54f3443ac (diff) | |
download | cpython-0d92c4f667518c7a24abda885e10c0c8e72cae57.zip cpython-0d92c4f667518c7a24abda885e10c0c8e72cae57.tar.gz cpython-0d92c4f667518c7a24abda885e10c0c8e72cae57.tar.bz2 |
Issue #16416: Fix error handling in _Py_wchar2char() _Py_char2wchar() functions
Diffstat (limited to 'Python')
-rw-r--r-- | Python/fileutils.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/Python/fileutils.c b/Python/fileutils.c index 42a532d..2cd75ce 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -67,10 +67,12 @@ _Py_char2wchar(const char* arg, size_t *size) #ifdef __APPLE__ wchar_t *wstr; wstr = _Py_DecodeUTF8_surrogateescape(arg, strlen(arg)); - if (wstr == NULL) - return NULL; - if (size != NULL) - *size = wcslen(wstr); + if (size != NULL) { + if (wstr != NULL) + *size = wcslen(wstr); + else + *size = (size_t)-1; + } return wstr; #else wchar_t *res; @@ -204,22 +206,25 @@ _Py_wchar2char(const wchar_t *text, size_t *error_pos) char *cpath; unicode = PyUnicode_FromWideChar(text, wcslen(text)); - if (unicode == NULL) { - Py_DECREF(unicode); + if (unicode == NULL) return NULL; - } bytes = _PyUnicode_AsUTF8String(unicode, "surrogateescape"); Py_DECREF(unicode); if (bytes == NULL) { PyErr_Clear(); + if (error_pos != NULL) + *error_pos = (size_t)-1; return NULL; } len = PyBytes_GET_SIZE(bytes); cpath = PyMem_Malloc(len+1); if (cpath == NULL) { + PyErr_Clear(); Py_DECREF(bytes); + if (error_pos != NULL) + *error_pos = (size_t)-1; return NULL; } memcpy(cpath, PyBytes_AsString(bytes), len + 1); @@ -231,9 +236,6 @@ _Py_wchar2char(const wchar_t *text, size_t *error_pos) size_t i, size, converted; wchar_t c, buf[2]; - if (error_pos != NULL) - *error_pos = (size_t)-1; - /* The function works in two steps: 1. compute the length of the output buffer in bytes (size) 2. outputs the bytes */ @@ -280,8 +282,11 @@ _Py_wchar2char(const wchar_t *text, size_t *error_pos) size += 1; /* nul byte at the end */ result = PyMem_Malloc(size); - if (result == NULL) + if (result == NULL) { + if (error_pos != NULL) + *error_pos = (size_t)-1; return NULL; + } bytes = result; } return result; |