authorgravatar for egoist@egoistic.devxEgoist <egoist@egoistic.dev> 2023-05-02 13:36:48-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-16 01:25:14-08:00
log41bf816fa6dd6fde0264db885c2f00757aba74b0
tree5aaa7a0fa8e8849db31f4f2f065e5f6d06581ff3
parent7116b02210bcae7bafac9017a7e47a14b52eafc2

child_process: Add write access to the null handle

This commit allows write access to the `\\Device\\Null` Handle. Without a write access, it's not possible for the child process to write SdOut to Null. As a requirement `SetHandleInformation` was also changed to mark the handle as iheritable (by adding it to Flags) by the spawned process. This allows the child to access the NUL device that was opened. This also makes the Windows part to behave similarly to `spawnPosix`.

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

lib/std/child_process.zig+3-3
...@@ -661,8 +661,8 @@ pub const ChildProcess = struct {...@@ -661,8 +661,8 @@ pub const ChildProcess = struct {
661 const nul_handle = if (any_ignore)661 const nul_handle = if (any_ignore)
662 // "\Device\Null" or "\??\NUL"662 // "\Device\Null" or "\??\NUL"
663 windows.OpenFile(&[_]u16{ '\\', 'D', 'e', 'v', 'i', 'c', 'e', '\\', 'N', 'u', 'l', 'l' }, .{663 windows.OpenFile(&[_]u16{ '\\', 'D', 'e', 'v', 'i', 'c', 'e', '\\', 'N', 'u', 'l', 'l' }, .{
664 .access_mask = windows.GENERIC_READ | windows.SYNCHRONIZE,664 .access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE | windows.SYNCHRONIZE,
665 .share_access = windows.FILE_SHARE_READ,665 .share_access = windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE,
666 .creation = windows.OPEN_EXISTING,666 .creation = windows.OPEN_EXISTING,
667 .io_mode = .blocking,667 .io_mode = .blocking,
668 }) catch |err| switch (err) {668 }) catch |err| switch (err) {
...@@ -681,7 +681,7 @@ pub const ChildProcess = struct {...@@ -681,7 +681,7 @@ pub const ChildProcess = struct {
681 if (any_ignore) os.close(nul_handle);681 if (any_ignore) os.close(nul_handle);
682 }682 }
683 if (any_ignore) {683 if (any_ignore) {
684 try windows.SetHandleInformation(nul_handle, windows.HANDLE_FLAG_INHERIT, 0);684 try windows.SetHandleInformation(nul_handle, windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT);
685 }685 }
686686
687 var g_hChildStd_IN_Rd: ?windows.HANDLE = null;687 var g_hChildStd_IN_Rd: ?windows.HANDLE = null;