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
         }