add nullptr to last arg in execv()

This commit is contained in:
Ryan Heywood 2025-07-12 14:33:48 -04:00
parent 42d499e76a
commit 68326174f7
Signed by: ryan
GPG Key ID: 8E401478A3FBEF72
1 changed files with 8 additions and 2 deletions

View File

@ -200,12 +200,18 @@ pub fn execv(command: impl AsRef<Path>, args: &[&str]) -> Result<()> {
.context(format_args!("bad command: {}", command.display()))?;
let mut args_cstr = vec![];
for arg in args {
let cur_arg_cstr = CString::new(arg.as_bytes()).context(format_args!("bad arg: {arg}"));
let cur_arg_cstr = CString::new(arg.as_bytes()).context(format_args!("bad arg: {arg}"))?;
args_cstr.push(cur_arg_cstr);
}
// NOTE: The last arg must be a null pointer. We construct a CString from the raw pointer.
args_cstr.push(unsafe { CString::from_raw(std::ptr::null_mut()) });
if unsafe { libc::execv(command_cstr.as_ptr().cast(), args_cstr.as_ptr().cast()) } == -1 {
return ctx_os_error(format_args!("error calling exec()"));
return ctx_os_error(format_args!(
"error calling exec({command}, {args:?})",
command = command.display()
));
}
Ok(())