authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-03 18:07:02-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-04 00:27:09-08:00
log2c22c3dabf08156eee00b927baf7d6a845a4c98d
treec7740be5cdb39255144a58c20a1fa81290bd2eec
parent08d8b412e9217018d760666094b89918de02f10e

std.Io.Threaded: make processReplace cancelable

In between each attempt to call execve() on a particular file path, it will check cancelation before trying the next PATH.

1 files changed, 5 insertions(+), 3 deletions(-)

lib/std/Io/Threaded.zig+5-3
......@@ -1428,7 +1428,7 @@ pub fn io(t: *Threaded) Io {
14281428 .tryLockStderr = tryLockStderr,
14291429 .unlockStderr = unlockStderr,
14301430 .processSetCurrentDir = processSetCurrentDir,
1431 .processReplace = processReplace, // TODO audit for cancelation and unreachable
1431 .processReplace = processReplace,
14321432 .processReplacePath = processReplacePath, // TODO audit for cancelation and unreachable
14331433 .processSpawn = processSpawn, // TODO audit for cancelation and unreachable
14341434 .processSpawnPath = processSpawnPath, // TODO audit for cancelation and unreachable
......@@ -12946,7 +12946,9 @@ fn spawnPosix(t: *Threaded, options: process.SpawnOptions) process.SpawnError!Sp
1294612946
1294712947 const pid_result = try posix.fork();
1294812948 if (pid_result == 0) {
12949 // we are the child
12949 // We are the child.
12950 if (Thread.current) |current_thread| current_thread.cancel_protection = .blocked;
12951
1295012952 setUpChildIo(options.stdin, stdin_pipe[0], posix.STDIN_FILENO, dev_null_fd) catch |err| forkBail(err_pipe[1], err);
1295112953 setUpChildIo(options.stdout, stdout_pipe[1], posix.STDOUT_FILENO, dev_null_fd) catch |err| forkBail(err_pipe[1], err);
1295212954 setUpChildIo(options.stderr, stderr_pipe[1], posix.STDERR_FILENO, dev_null_fd) catch |err| forkBail(err_pipe[1], err);
......@@ -14585,8 +14587,8 @@ pub fn posixExecvPath(
1458514587 child_argv: [*:null]const ?[*:0]const u8,
1458614588 envp: [*:null]const ?[*:0]const u8,
1458714589) process.ReplaceError {
14590 try Thread.checkCancel();
1458814591 switch (posix.errno(posix.system.execve(path, child_argv, envp))) {
14589 .SUCCESS => unreachable,
1459014592 .FAULT => |err| return errnoBug(err), // Bad pointer parameter.
1459114593 .@"2BIG" => return error.SystemResources,
1459214594 .MFILE => return error.ProcessFdQuotaExceeded,