From 5358af7ba4cf16bef1734729646b99842e439916 Mon Sep 17 00:00:00 2001 From: Ryan Liptak Date: Sat, 8 Nov 2025 23:45:31 -0800 Subject: [PATCH] incr-check: Kill child process on error Since the child process is spawned with the tmp directory as its CWD, the child process opens it without DELETE access. On error, the child process would still be alive while the tmp directory is attempting to be deleted, so it would fail with `.SHARING_VIOLATION => return error.FileBusy`. Fixes arguably the least important part of #22510, since it's only the directory itself that would fail to get deleted, all the files inside would get deleted just fine. --- tools/incr-check.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/incr-check.zig b/tools/incr-check.zig index dffd3ccb34..6d3a38760f 100644 --- a/tools/incr-check.zig +++ b/tools/incr-check.zig @@ -197,6 +197,9 @@ pub fn main() !void { }; try child.spawn(); + errdefer { + _ = child.kill() catch {}; + } var poller = Io.poll(arena, Eval.StreamEnum, .{ .stdout = child.stdout.?, @@ -585,6 +588,8 @@ const Eval = struct { fn fatal(eval: *Eval, comptime fmt: []const u8, args: anytype) noreturn { eval.tmp_dir.close(); if (!eval.preserve_tmp_on_fatal) { + // Kill the child since it holds an open handle to its CWD which is the tmp dir path + _ = eval.child.kill() catch {}; std.fs.cwd().deleteTree(eval.tmp_dir_path) catch |err| { std.log.warn("failed to delete tree '{s}': {s}", .{ eval.tmp_dir_path, @errorName(err) }); };