From 3dac3d1ed6ee1cff8f5594ee947364658256fb6b Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Tue, 5 Jul 2022 14:24:17 +0200 Subject: [PATCH] Fix env parsing. --- src/exec.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/exec.rs b/src/exec.rs index 9f2563f290..64741de024 100644 --- a/src/exec.rs +++ b/src/exec.rs @@ -13,18 +13,20 @@ pub unsafe extern "C" fn main(_: libc::c_int, _: *const *const libc::c_char) -> // TODO: Handle this, we can allocate as much as we want in theory. panic!("env is too large"); } + let env = &mut env[..bytes_read]; for c in &mut *env { if *c == b'\n' { *c = b'\0'; } } - let env_count = env.split(|c| *c == b'\0').count(); + let iter = || env.split(|c| *c == b'\0').filter(|var| !var.is_empty()); + let env_count = iter().count(); - let envp = libc::calloc(env_count, core::mem::size_of::<*const u8>()) as *mut *const libc::c_char; + let envp = libc::calloc(env_count + 1, core::mem::size_of::<*const u8>()) as *mut *const libc::c_char; if envp.is_null() { panic!("failed to allocate envp buf"); } - for (idx, var) in env.split(|c| *c == b'\0').enumerate() { + for (idx, var) in iter().enumerate() { envp.add(idx).write(var.as_ptr() as *const libc::c_char); }