diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | win32/win32.c | 24 |
2 files changed, 23 insertions, 8 deletions
@@ -1,3 +1,10 @@ +Mon Aug 5 17:33:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * win32/win32.c (wstr_to_mbstr, mbstr_to_wstr): fix wrong trimming. + WideCharToMultiByte() and MultiByteToWideChar() do not count + NUL-terminator in the size for conversion result, unless the input + length is -1. + Mon Aug 5 11:51:00 2013 Charlie Somerville <charliesome@ruby-lang.org> * include/ruby/encoding.h: document which user flags are used by diff --git a/win32/win32.c b/win32/win32.c index 0a03d7bcca..ab2b64a5e4 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1954,10 +1954,14 @@ static char * wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen, long *plen) { char *ptr; - int len = WideCharToMultiByte(cp, 0, wstr, clen, NULL, 0, NULL, NULL) - 1; - if (!(ptr = malloc(len + 1))) return 0; - WideCharToMultiByte(cp, 0, wstr, clen, ptr, len + 1, NULL, NULL); - if (plen) *plen = len; + int len = WideCharToMultiByte(cp, 0, wstr, clen, NULL, 0, NULL, NULL); + if (!(ptr = malloc(len))) return 0; + WideCharToMultiByte(cp, 0, wstr, clen, ptr, len, NULL, NULL); + if (plen) { + /* exclude NUL only if NUL-terminated string */ + if (clen == -1) --len; + *plen = len; + } return ptr; } @@ -1966,10 +1970,14 @@ static WCHAR * mbstr_to_wstr(UINT cp, const char *str, int clen, long *plen) { WCHAR *ptr; - int len = MultiByteToWideChar(cp, 0, str, clen, NULL, 0) - 1; - if (!(ptr = malloc(sizeof(WCHAR) * (len + 1)))) return 0; - MultiByteToWideChar(cp, 0, str, clen, ptr, len + 1); - if (plen) *plen = len; + int len = MultiByteToWideChar(cp, 0, str, clen, NULL, 0); + if (!(ptr = malloc(sizeof(WCHAR) * len))) return 0; + MultiByteToWideChar(cp, 0, str, clen, ptr, len); + if (plen) { + /* exclude NUL only if NUL-terminated string */ + if (clen == -1) --len; + *plen = len; + } return ptr; } |