From cffe9e041dc62b98ac83f34c78128febda3d6122 Mon Sep 17 00:00:00 2001 From: klutzy Date: Sat, 22 Mar 2014 23:13:40 +0900 Subject: [PATCH] std::os: Handle FormatMessage failure `FormatMessageW()` is called by `std::os::last_os_error()` to convert errno into string, but the function may fail on non-english locale. I don't know why it fails, but anyway it's better to return errno than to `fail!()` in the case. Fixes #13075 Fixes #13073 --- src/libstd/os.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libstd/os.rs b/src/libstd/os.rs index d03757c1e6905..f270c7e7a743c 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -740,11 +740,16 @@ pub fn last_os_error() -> ~str { buf.len() as DWORD, ptr::null()); if res == 0 { - fail!("[{}] FormatMessage failure", errno()); + // Sometimes FormatMessageW can fail e.g. system doesn't like langId, + let fm_err = errno(); + return format!("OS Error {} (FormatMessageW() returned error {})", err, fm_err); } - str::from_utf16(str::truncate_utf16_at_nul(buf)) - .expect("FormatMessageW returned invalid UTF-16") + let msg = str::from_utf16(str::truncate_utf16_at_nul(buf)); + match msg { + Some(msg) => format!("OS Error {}: {}", err, msg), + None => format!("OS Error {} (FormatMessageW() returned invalid UTF-16)", err), + } } }