authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2020-12-27 13:00:35+01:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2020-12-27 14:23:59+01:00
log8000262e07d00b996dfcd07ab6c26c5db28f42d9
tree035114f6f29439cf082f4d4f09443a34b5e1b6d6
parent4d1096976aa835becac4554e99f7a92117c380f1
signaturelock-open Commit is signed but in an unrecognized format.

std: clean up sentinel handling for argv/environ


2 files changed, 13 insertions(+), 30 deletions(-)

lib/std/child_process.zig+10-20
......@@ -390,15 +390,8 @@ pub const ChildProcess = struct {
390390 // can fail between fork() and execve().
391391 // Therefore, we do all the allocation for the execve() before the fork().
392392 // This means we must do the null-termination of argv and env vars here.
393 const argv_buf = try arena.alloc(?[*:0]u8, self.argv.len + 1);
394 for (self.argv) |arg, i| {
395 const arg_buf = try arena.alloc(u8, arg.len + 1);
396 @memcpy(arg_buf.ptr, arg.ptr, arg.len);
397 arg_buf[arg.len] = 0;
398 argv_buf[i] = arg_buf[0..arg.len :0].ptr;
399 }
400 argv_buf[self.argv.len] = null;
401 const argv_ptr = argv_buf[0..self.argv.len :null].ptr;
393 const argv_buf = try arena.allocSentinel(?[*:0]u8, self.argv.len, null);
394 for (self.argv) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
402395
403396 const envp = m: {
404397 if (self.env_map) |env_map| {
......@@ -465,8 +458,8 @@ pub const ChildProcess = struct {
465458 }
466459
467460 const err = switch (self.expand_arg0) {
468 .expand => os.execvpeZ_expandArg0(.expand, argv_buf.ptr[0].?, argv_ptr, envp),
469 .no_expand => os.execvpeZ_expandArg0(.no_expand, argv_buf.ptr[0].?, argv_ptr, envp),
461 .expand => os.execvpeZ_expandArg0(.expand, argv_buf.ptr[0].?, argv_buf.ptr, envp),
462 .no_expand => os.execvpeZ_expandArg0(.no_expand, argv_buf.ptr[0].?, argv_buf.ptr, envp),
470463 };
471464 forkChildErrReport(err_pipe[1], err);
472465 }
......@@ -913,23 +906,20 @@ pub fn createWindowsEnvBlock(allocator: *mem.Allocator, env_map: *const BufMap)
913906
914907pub fn createNullDelimitedEnvMap(arena: *mem.Allocator, env_map: *const std.BufMap) ![:null]?[*:0]u8 {
915908 const envp_count = env_map.count();
916 const envp_buf = try arena.alloc(?[*:0]u8, envp_count + 1);
917 mem.set(?[*:0]u8, envp_buf, null);
909 const envp_buf = try arena.allocSentinel(?[*:0]u8, envp_count, null);
918910 {
919911 var it = env_map.iterator();
920912 var i: usize = 0;
921913 while (it.next()) |pair| : (i += 1) {
922 const env_buf = try arena.alloc(u8, pair.key.len + pair.value.len + 2);
923 @memcpy(env_buf.ptr, pair.key.ptr, pair.key.len);
914 const env_buf = try arena.allocSentinel(u8, pair.key.len + pair.value.len + 1, 0);
915 mem.copy(u8, env_buf, pair.key);
924916 env_buf[pair.key.len] = '=';
925 @memcpy(env_buf.ptr + pair.key.len + 1, pair.value.ptr, pair.value.len);
926 const len = env_buf.len - 1;
927 env_buf[len] = 0;
928 envp_buf[i] = env_buf[0..len :0].ptr;
917 mem.copy(u8, env_buf[pair.key.len + 1 ..], pair.value);
918 envp_buf[i] = env_buf.ptr;
929919 }
930920 assert(i == envp_count);
931921 }
932 return envp_buf[0..envp_count :null];
922 return envp_buf;
933923}
934924
935925test "createNullDelimitedEnvMap" {
lib/std/process.zig+3-10
......@@ -816,15 +816,8 @@ pub fn execve(
816816 defer arena_allocator.deinit();
817817 const arena = &arena_allocator.allocator;
818818
819 const argv_buf = try arena.alloc(?[*:0]u8, argv.len + 1);
820 for (argv) |arg, i| {
821 const arg_buf = try arena.alloc(u8, arg.len + 1);
822 @memcpy(arg_buf.ptr, arg.ptr, arg.len);
823 arg_buf[arg.len] = 0;
824 argv_buf[i] = arg_buf[0..arg.len :0].ptr;
825 }
826 argv_buf[argv.len] = null;
827 const argv_ptr = argv_buf[0..argv.len :null].ptr;
819 const argv_buf = try arena.allocSentinel(?[*:0]u8, argv.len, null);
820 for (argv) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
828821
829822 const envp = m: {
830823 if (env_map) |m| {
......@@ -842,5 +835,5 @@ pub fn execve(
842835 }
843836 };
844837
845 return os.execvpeZ_expandArg0(.no_expand, argv_buf.ptr[0].?, argv_ptr, envp);
838 return os.execvpeZ_expandArg0(.no_expand, argv_buf.ptr[0].?, argv_buf.ptr, envp);
846839}