Commit 5358af7ba4

Ryan Liptak <squeek502@hotmail.com>
2025-11-09 08:45:31
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.
1 parent b31a03f
Changed files (1)
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) });
             };