diff options
| author | klutzy <klutzytheklutzy@gmail.com> | 2014-03-22 23:13:40 +0900 |
|---|---|---|
| committer | klutzy <klutzytheklutzy@gmail.com> | 2014-03-22 23:57:13 +0900 |
| commit | cffe9e041dc62b98ac83f34c78128febda3d6122 (patch) | |
| tree | 5caec6608c10f6a499de3289108e689b262dd5d5 /src/libstd | |
| parent | 30165e059c0a111a53020108686b6fd11fcc1d03 (diff) | |
| download | rust-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.rs | 11 |
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), + } } } |
