diff options
| -rw-r--r-- | src/libcore/os.rs | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/libcore/os.rs b/src/libcore/os.rs index 6ed8d70642c..8f3f02c82e6 100644 --- a/src/libcore/os.rs +++ b/src/libcore/os.rs @@ -108,9 +108,10 @@ pub mod win32 { let mut res = None; let mut done = false; while !done { - let mut buf = vec::from_elem(n as uint, 0u16); + let mut k: DWORD = 0; + let buf = vec::cast_to_mut(vec::from_elem(n as uint, 0u16)); do vec::as_mut_buf(buf) |b, _sz| { - let k : DWORD = f(b, TMPBUF_SZ as DWORD); + k = f(b, TMPBUF_SZ as DWORD); if k == (0 as DWORD) { done = true; } else if (k == n && @@ -118,11 +119,13 @@ pub mod win32 { libc::ERROR_INSUFFICIENT_BUFFER as DWORD) { n *= (2 as DWORD); } else { - let sub = vec::slice(buf, 0u, k as uint); - res = option::Some(str::from_utf16(sub)); done = true; } } + if k != 0 && done { + let sub = vec::slice(buf, 0u, k as uint); + res = option::Some(str::from_utf16(sub)); + } } return res; } |
