@@ -2,11 +2,10 @@ package cmd
22
33import (
44 "context"
5+ "fmt"
56 "os"
67 "os/exec"
78 "os/signal"
8- "sync"
9- "sync/atomic"
109 "unsafe"
1110
1211 "github.com/circleci/ex/o11y"
@@ -30,13 +29,16 @@ func switchUser(ctx context.Context, _ *exec.Cmd, user string) {
3029}
3130
3231func additionalSetup (_ context.Context , cmd * exec.Cmd ) {
32+ if cmd .SysProcAttr == nil {
33+ cmd .SysProcAttr = & windows.SysProcAttr {}
34+ }
3335 cmd .SysProcAttr .CreationFlags = windows .CREATE_NEW_PROCESS_GROUP
3436}
3537
3638func (c * Command ) start () error {
3739 g , err := newProcessExitGroup ()
3840 if err != nil {
39- return err
41+ return fmt . Errorf ( "failed to create new process group: %w" , err )
4042 }
4143
4244 c .cmd .Cancel = func () error {
@@ -47,17 +49,11 @@ func (c *Command) start() error {
4749 return err
4850 }
4951
50- return g .AddProcess (c .cmd .Process )
51- }
52+ if err := g .AddProcess (c .cmd .Process ); err != nil {
53+ return fmt .Errorf ("failed to add process to group: %w" , err )
54+ }
5255
53- // Process struct matches os.Process layout to extract handle via unsafe pointer
54- // https://stackoverflow.com/a/56739249
55- type process struct {
56- Pid int
57- _ uint8
58- _ atomic.Uint64
59- _ sync.RWMutex
60- Handle uintptr
56+ return nil
6157}
6258
6359type processExitGroup windows.Handle
@@ -89,7 +85,11 @@ func (g processExitGroup) Dispose() error {
8985}
9086
9187func (g processExitGroup ) AddProcess (p * os.Process ) error {
92- return windows .AssignProcessToJobObject (
93- windows .Handle (g ),
94- windows .Handle ((* process )(unsafe .Pointer (p )).Handle ))
88+ handle , err := windows .OpenProcess (windows .PROCESS_SET_QUOTA | windows .PROCESS_TERMINATE , false , uint32 (p .Pid ))
89+ if err != nil {
90+ return err
91+ }
92+ defer windows .CloseHandle (handle )
93+
94+ return windows .AssignProcessToJobObject (windows .Handle (g ), handle )
9595}
0 commit comments