diff --git a/src/pwd/src/lib.rs b/src/pwd/src/lib.rs index e2eb510cb8a2274d57bebbad30148a0ae343842c..58acf3587038a7b39c3d57b32a55207549ffadbd 100644 --- a/src/pwd/src/lib.rs +++ b/src/pwd/src/lib.rs @@ -83,16 +83,17 @@ fn pwd_lookup<F>(out: *mut passwd, alloc: Option<(*mut c_char, size_t)>, mut cal } let read = platform::read(*file, &mut buf[len..]); + + unsafe { + buf.set_len(len + read as usize); + } + if read == 0 { return OptionPasswd::NotFound; } if read < 0 { return OptionPasswd::Error; } - - unsafe { - buf.set_len(len + read as usize); - } } // Parse into passwd @@ -262,6 +263,9 @@ pub extern "C" fn getpwuid(uid: uid_t) -> *mut passwd { OptionPasswd::Error => ptr::null_mut(), OptionPasswd::NotFound => ptr::null_mut(), OptionPasswd::Found(buf) => unsafe { + if PASSWD_BUF != ptr::null_mut() { + platform::free(PASSWD_BUF as *mut c_void); + } PASSWD_BUF = buf; &mut PASSWD }