diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 74e2fceb6cae6..458e31fd86f5f 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -113,13 +113,15 @@ pub mod win32 { let mut done = false; while !done { let mut buf = vec::from_elem(n as uint, 0u16); - let k = f(buf.as_mut_ptr(), TMPBUF_SZ as DWORD); + let k = f(buf.as_mut_ptr(), n); if k == (0 as DWORD) { done = true; } else if k == n && libc::GetLastError() == libc::ERROR_INSUFFICIENT_BUFFER as DWORD { n *= (2 as DWORD); + } else if k >= n { + n = k; } else { done = true; } @@ -1494,6 +1496,16 @@ mod tests { } } + #[test] + fn test_env_set_get_huge() { + let n = make_rand_name(); + let s = "x".repeat(10000); + setenv(n, s); + assert_eq!(getenv(n), Some(s)); + unsetenv(n); + assert_eq!(getenv(n), None); + } + #[test] fn test_env_setenv() { let n = make_rand_name();