aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--win32/win32.c24
2 files changed, 23 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 937d21426d..33bf880953 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}