From f3c88825337c295850de546bd3d8745c8cad1224 Mon Sep 17 00:00:00 2001 From: klutzy Date: Mon, 16 Sep 2013 00:02:58 +0900 Subject: [PATCH] std::os: Use unicode for last_os_error() on Win32 FormatMessageA may return non-ascii message, which is encoded as system code page, not utf8. This may cause `assert!(is_utf8(v))` failure on some non-English machines. This patch replaces it with FormatMessageW, which returns utf-16 message. Fixes `make check-stage2-std` failure on my machine. :) --- src/libstd/os.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 5269eca888a..c45f2af8f7e 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -1135,18 +1135,19 @@ pub fn last_os_error() -> ~str { #[fixed_stack_segment]; #[inline(never)]; use libc::types::os::arch::extra::DWORD; - use libc::types::os::arch::extra::LPSTR; + use libc::types::os::arch::extra::LPWSTR; use libc::types::os::arch::extra::LPVOID; + use libc::types::os::arch::extra::WCHAR; #[cfg(target_arch = "x86")] #[link_name = "kernel32"] #[abi = "stdcall"] extern "stdcall" { - fn FormatMessageA(flags: DWORD, + fn FormatMessageW(flags: DWORD, lpSrc: LPVOID, msgId: DWORD, langId: DWORD, - buf: LPSTR, + buf: LPWSTR, nsize: DWORD, args: *c_void) -> DWORD; @@ -1155,11 +1156,11 @@ pub fn last_os_error() -> ~str { #[cfg(target_arch = "x86_64")] #[link_name = "kernel32"] extern { - fn FormatMessageA(flags: DWORD, + fn FormatMessageW(flags: DWORD, lpSrc: LPVOID, msgId: DWORD, langId: DWORD, - buf: LPSTR, + buf: LPWSTR, nsize: DWORD, args: *c_void) -> DWORD; @@ -1173,11 +1174,11 @@ pub fn last_os_error() -> ~str { let langId = 0x0800 as DWORD; let err = errno() as DWORD; - let mut buf = [0 as c_char, ..TMPBUF_SZ]; + let mut buf = [0 as WCHAR, ..TMPBUF_SZ]; unsafe { do buf.as_mut_buf |buf, len| { - let res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | + let res = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, ptr::mut_null(), err, @@ -1190,9 +1191,7 @@ pub fn last_os_error() -> ~str { } } - do buf.as_imm_buf |buf, _len| { - str::raw::from_c_str(buf) - } + str::from_utf16(buf) } }