From 6da2639dfa293d614bbfb35175344426f3358406 Mon Sep 17 00:00:00 2001
From: jD91mZM2 <me@krake.one>
Date: Sat, 28 Jul 2018 08:22:21 +0200
Subject: [PATCH] Fix leaking uninitialized elements and missing free

---
 src/pwd/src/lib.rs | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/pwd/src/lib.rs b/src/pwd/src/lib.rs
index e2eb510c..58acf358 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
         }
-- 
GitLab