about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorklutzy <klutzytheklutzy@gmail.com>2014-03-22 23:13:40 +0900
committerklutzy <klutzytheklutzy@gmail.com>2014-03-22 23:57:13 +0900
commitcffe9e041dc62b98ac83f34c78128febda3d6122 (patch)
tree5caec6608c10f6a499de3289108e689b262dd5d5 /src/libstd
parent30165e059c0a111a53020108686b6fd11fcc1d03 (diff)
downloadrust-cffe9e041dc62b98ac83f34c78128febda3d6122.tar.gz
rust-cffe9e041dc62b98ac83f34c78128febda3d6122.zip
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
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/os.rs11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/libstd/os.rs b/src/libstd/os.rs
index d03757c1e69..f270c7e7a74 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),
+            }
         }
     }