@@ -17,7 +17,7 @@ type osCmd struct {
1717
1818 // A job object to helper ensure processes are killed, plus a Once
1919 // to ensure the job object is only closed one.
20- jobObject uintptr
20+ jobObject windows. Handle
2121 once sync.Once
2222}
2323
@@ -68,7 +68,7 @@ func (c *osCmd) closeJobObject() {
6868 return
6969 }
7070 c .once .Do (func () {
71- windows .CloseHandle (windows . Handle ( c .jobObject ) )
71+ windows .CloseHandle (c .jobObject )
7272 })
7373}
7474
@@ -82,7 +82,7 @@ func setProcessGroup(c *exec.Cmd, useLegacyStrategy bool) {
8282 }
8383}
8484
85- func createJobObject () (uintptr , error ) {
85+ func createJobObject () (windows. Handle , error ) {
8686 jobObj , err := windows .CreateJobObject (nil , nil )
8787 if err != nil {
8888 return 0 , fmt .Errorf ("creating job object: %w" , err )
@@ -102,31 +102,30 @@ func createJobObject() (uintptr, error) {
102102 return 0 , fmt .Errorf ("setting job object information: %w" , err )
103103 }
104104
105- return uintptr ( jobObj ) , nil
105+ return jobObj , nil
106106}
107107
108108// Assign the process with specified PID to the specified job object. Processes created as children of that one will
109109// also be assigned to the job. When the last handle on the job is closed, all associated processes will be terminated.
110- func assignProcessToJobObject (pid int , jobObject uintptr ) error {
110+ func assignProcessToJobObject (pid int , jobObject windows. Handle ) error {
111111 procHandle , err := findProcessHandleFromPID (pid )
112112 if err != nil {
113113 return fmt .Errorf ("failed to retrieve handle for process: %w" , err )
114114 }
115+ defer windows .CloseHandle (procHandle )
115116
116- if err = windows .AssignProcessToJobObject (windows . Handle ( jobObject ), windows . Handle ( procHandle ) ); err != nil {
117+ if err = windows .AssignProcessToJobObject (jobObject , procHandle ); err != nil {
117118 return fmt .Errorf ("failed to assign process to job: %w" , err )
118119 }
119120 return nil
120121}
121122
122- func findProcessHandleFromPID (pid int ) (uintptr , error ) {
123- const da = windows .PROCESS_TERMINATE | windows .PROCESS_SET_QUOTA
124- h , err := syscall .OpenProcess (da , false , uint32 (pid ))
123+ func findProcessHandleFromPID (pid int ) (windows. Handle , error ) {
124+ const desiredAccess = windows .PROCESS_TERMINATE | windows .PROCESS_SET_QUOTA
125+ handle , err := windows .OpenProcess (desiredAccess , false , uint32 (pid ))
125126 if err != nil {
126127 return 0 , fmt .Errorf ("calling OpenProcess: %w" , err )
127128 }
128- if uintptr (h ) == 0 {
129- return 0 , fmt .Errorf ("getting process handle for pid %q" , pid )
130- }
131- return uintptr (h ), nil
129+
130+ return handle , nil
132131}
0 commit comments