diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-03-20 19:45:18 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-20 19:45:18 (GMT) |
commit | c1e2c288f41cdc1c6e6e09d9a5277a58232ceb03 (patch) | |
tree | 058299d518ec9061b3b0735f08e0f49c874e733d /Objects | |
parent | cc60cdd9c44dd15e441603ee5f78e09ea3e76929 (diff) | |
download | cpython-c1e2c288f41cdc1c6e6e09d9a5277a58232ceb03.zip cpython-c1e2c288f41cdc1c6e6e09d9a5277a58232ceb03.tar.gz cpython-c1e2c288f41cdc1c6e6e09d9a5277a58232ceb03.tar.bz2 |
bpo-36312: Fix decoders for some code pages. (GH-12369)
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/unicodeobject.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 6e83ed6..8ab3943 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7083,15 +7083,21 @@ decode_code_page_strict(UINT code_page, const char *in, int insize) { - const DWORD flags = decode_code_page_flags(code_page); + DWORD flags = MB_ERR_INVALID_CHARS; wchar_t *out; DWORD outsize; /* First get the size of the result */ assert(insize > 0); - outsize = MultiByteToWideChar(code_page, flags, in, insize, NULL, 0); - if (outsize <= 0) - goto error; + while ((outsize = MultiByteToWideChar(code_page, flags, + in, insize, NULL, 0)) <= 0) + { + if (!flags || GetLastError() != ERROR_INVALID_FLAGS) { + goto error; + } + /* For some code pages (e.g. UTF-7) flags must be set to 0. */ + flags = 0; + } /* Extend a wchar_t* buffer */ Py_ssize_t n = *bufsize; /* Get the current length */ @@ -7129,7 +7135,7 @@ decode_code_page_errors(UINT code_page, { const char *startin = in; const char *endin = in + size; - const DWORD flags = decode_code_page_flags(code_page); + DWORD flags = MB_ERR_INVALID_CHARS; /* Ideally, we should get reason from FormatMessage. This is the Windows 2000 English version of the message. */ const char *reason = "No mapping for the Unicode character exists " @@ -7187,6 +7193,11 @@ decode_code_page_errors(UINT code_page, if (outsize > 0) break; err = GetLastError(); + if (err == ERROR_INVALID_FLAGS && flags) { + /* For some code pages (e.g. UTF-7) flags must be set to 0. */ + flags = 0; + continue; + } if (err != ERROR_NO_UNICODE_TRANSLATION && err != ERROR_INSUFFICIENT_BUFFER) { |