From 3eb52eabf5f339cd2f8acf95cfd1f84dfb21e430 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Thu, 4 Aug 2022 08:55:01 -0600
Subject: [PATCH] Fix missing NUL for setenv

---
 src/header/stdlib/mod.rs | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs
index d48b67ac..39793092 100644
--- a/src/header/stdlib/mod.rs
+++ b/src/header/stdlib/mod.rs
@@ -857,6 +857,7 @@ unsafe fn copy_kv(existing: *mut c_char, key: *const c_char, value: *const c_cha
     core::ptr::copy_nonoverlapping(key, existing, key_len);
     core::ptr::write(existing.add(key_len), b'=' as c_char);
     core::ptr::copy_nonoverlapping(value, existing.add(key_len + 1), value_len);
+    core::ptr::write(existing.add(key_len + 1 + value_len), 0);
 }
 
 #[no_mangle]
@@ -878,15 +879,17 @@ pub unsafe extern "C" fn setenv(
         if existing_len >= value_len {
             // Reuse existing element's allocation
             core::ptr::copy_nonoverlapping(value, existing, value_len);
+            //TODO: fill to end with zeroes
+            core::ptr::write(existing.add(value_len), 0);
         } else {
             // Reuse platform::environ slot, but allocate a new pointer.
-            let mut ptr = platform::alloc(key_len as usize + 1 + value_len as usize) as *mut c_char;
+            let mut ptr = platform::alloc(key_len as usize + 1 + value_len as usize + 1) as *mut c_char;
             copy_kv(ptr, key, value, key_len, value_len);
             platform::environ.add(i).write(ptr);
         }
     } else {
         // Expand platform::environ and allocate a new pointer.
-        let mut ptr = platform::alloc(key_len as usize + 1 + value_len as usize) as *mut c_char;
+        let mut ptr = platform::alloc(key_len as usize + 1 + value_len as usize + 1) as *mut c_char;
         copy_kv(ptr, key, value, key_len, value_len);
         put_new_env(ptr);
     }
-- 
GitLab