about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcore/os.rs11
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;
         }