zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit a338c279f82bfeb68e37b40cd4fc59557336b6ce (tree)
parent 1ce12db5c8b8d0369d431cbfa90fa6dc4c0141ce
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Tue, 16 Jan 2024 15:03:25 -0800

Merge pull request #15565 from xEgoist/spawnWindows

child_process: Add write and inheritable access to the null handle
Diffstat:
Mlib/std/child_process.zig | 10++++------
Mlib/std/os/windows.zig | 5++++-
2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/lib/std/child_process.zig b/lib/std/child_process.zig @@ -650,7 +650,7 @@ pub const ChildProcess = struct { } fn spawnWindows(self: *ChildProcess) SpawnError!void { - const saAttr = windows.SECURITY_ATTRIBUTES{ + var saAttr = windows.SECURITY_ATTRIBUTES{ .nLength = @sizeOf(windows.SECURITY_ATTRIBUTES), .bInheritHandle = windows.TRUE, .lpSecurityDescriptor = null, @@ -661,8 +661,9 @@ pub const ChildProcess = struct { const nul_handle = if (any_ignore) // "\Device\Null" or "\??\NUL" windows.OpenFile(&[_]u16{ '\\', 'D', 'e', 'v', 'i', 'c', 'e', '\\', 'N', 'u', 'l', 'l' }, .{ - .access_mask = windows.GENERIC_READ | windows.SYNCHRONIZE, - .share_access = windows.FILE_SHARE_READ, + .access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE | windows.SYNCHRONIZE, + .share_access = windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE, + .sa = &saAttr, .creation = windows.OPEN_EXISTING, .io_mode = .blocking, }) catch |err| switch (err) { @@ -680,9 +681,6 @@ pub const ChildProcess = struct { defer { if (any_ignore) os.close(nul_handle); } - if (any_ignore) { - try windows.SetHandleInformation(nul_handle, windows.HANDLE_FLAG_INHERIT, 0); - } var g_hChildStd_IN_Rd: ?windows.HANDLE = null; var g_hChildStd_IN_Wr: ?windows.HANDLE = null; diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig @@ -86,7 +86,10 @@ pub fn OpenFile(sub_path_w: []const u16, options: OpenFileOptions) OpenError!HAN var attr = OBJECT_ATTRIBUTES{ .Length = @sizeOf(OBJECT_ATTRIBUTES), .RootDirectory = if (std.fs.path.isAbsoluteWindowsWTF16(sub_path_w)) null else options.dir, - .Attributes = 0, // Note we do not use OBJ_CASE_INSENSITIVE here. + .Attributes = if (options.sa) |ptr| blk: { // Note we do not use OBJ_CASE_INSENSITIVE here. + const inherit: ULONG = if (ptr.bInheritHandle == TRUE) OBJ_INHERIT else 0; + break :blk inherit; + } else 0, .ObjectName = &nt_name, .SecurityDescriptor = if (options.sa) |ptr| ptr.lpSecurityDescriptor else null, .SecurityQualityOfService = null,