go.mod: Update hcsshim to v0.9.2
This tag brings in some bug fixes related to waiting for containers to terminate and trying to kill an already terminated process, as well as tty support (exec -it) for Windows Host Process Containers. Signed-off-by: Daniel Canter <dcanter@microsoft.com>
This commit is contained in:
		
							
								
								
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | ||||
| run: | ||||
|   timeout: 8m | ||||
|  | ||||
| linters: | ||||
|   enable: | ||||
|     - stylecheck | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -29,7 +29,7 @@ require ( | ||||
| 	go.opencensus.io v0.22.3 | ||||
| 	golang.org/x/net v0.0.0-20210825183410-e898025ed96a // indirect | ||||
| 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c | ||||
| 	golang.org/x/sys v0.0.0-20210510120138-977fb7262007 | ||||
| 	golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e | ||||
| 	google.golang.org/grpc v1.40.0 | ||||
| ) | ||||
|  | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -812,8 +812,9 @@ golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7w | ||||
| golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= | ||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= | ||||
| golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
|   | ||||
							
								
								
									
										16
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -78,6 +78,13 @@ var ( | ||||
|  | ||||
| 	// ErrNotSupported is an error encountered when hcs doesn't support the request | ||||
| 	ErrPlatformNotSupported = errors.New("unsupported platform request") | ||||
|  | ||||
| 	// ErrProcessAlreadyStopped is returned by hcs if the process we're trying to kill has already been stopped. | ||||
| 	ErrProcessAlreadyStopped = syscall.Errno(0x8037011f) | ||||
|  | ||||
| 	// ErrInvalidHandle is an error that can be encountrered when querying the properties of a compute system when the handle to that | ||||
| 	// compute system has already been closed. | ||||
| 	ErrInvalidHandle = syscall.Errno(0x6) | ||||
| ) | ||||
|  | ||||
| type ErrorEvent struct { | ||||
| @@ -249,6 +256,14 @@ func IsNotExist(err error) bool { | ||||
| 		err == ErrElementNotFound | ||||
| } | ||||
|  | ||||
| // IsErrorInvalidHandle checks whether the error is the result of an operation carried | ||||
| // out on a handle that is invalid/closed. This error popped up while trying to query | ||||
| // stats on a container in the process of being stopped. | ||||
| func IsErrorInvalidHandle(err error) bool { | ||||
| 	err = getInnerError(err) | ||||
| 	return err == ErrInvalidHandle | ||||
| } | ||||
|  | ||||
| // IsAlreadyClosed checks if an error is caused by the Container or Process having been | ||||
| // already closed by a call to the Close() method. | ||||
| func IsAlreadyClosed(err error) bool { | ||||
| @@ -281,6 +296,7 @@ func IsTimeout(err error) bool { | ||||
| func IsAlreadyStopped(err error) bool { | ||||
| 	err = getInnerError(err) | ||||
| 	return err == ErrVmcomputeAlreadyStopped || | ||||
| 		err == ErrProcessAlreadyStopped || | ||||
| 		err == ErrElementNotFound | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										56
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/process.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -3,7 +3,9 @@ package hcs | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"sync" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
| @@ -16,16 +18,17 @@ import ( | ||||
|  | ||||
| // ContainerError is an error encountered in HCS | ||||
| type Process struct { | ||||
| 	handleLock     sync.RWMutex | ||||
| 	handle         vmcompute.HcsProcess | ||||
| 	processID      int | ||||
| 	system         *System | ||||
| 	hasCachedStdio bool | ||||
| 	stdioLock      sync.Mutex | ||||
| 	stdin          io.WriteCloser | ||||
| 	stdout         io.ReadCloser | ||||
| 	stderr         io.ReadCloser | ||||
| 	callbackNumber uintptr | ||||
| 	handleLock          sync.RWMutex | ||||
| 	handle              vmcompute.HcsProcess | ||||
| 	processID           int | ||||
| 	system              *System | ||||
| 	hasCachedStdio      bool | ||||
| 	stdioLock           sync.Mutex | ||||
| 	stdin               io.WriteCloser | ||||
| 	stdout              io.ReadCloser | ||||
| 	stderr              io.ReadCloser | ||||
| 	callbackNumber      uintptr | ||||
| 	killSignalDelivered bool | ||||
|  | ||||
| 	closedWaitOnce sync.Once | ||||
| 	waitBlock      chan struct{} | ||||
| @@ -149,12 +152,45 @@ func (process *Process) Kill(ctx context.Context) (bool, error) { | ||||
| 		return false, makeProcessError(process, operation, ErrAlreadyClosed, nil) | ||||
| 	} | ||||
|  | ||||
| 	if process.killSignalDelivered { | ||||
| 		// A kill signal has already been sent to this process. Sending a second | ||||
| 		// one offers no real benefit, as processes cannot stop themselves from | ||||
| 		// being terminated, once a TerminateProcess has been issued. Sending a | ||||
| 		// second kill may result in a number of errors (two of which detailed bellow) | ||||
| 		// and which we can avoid handling. | ||||
| 		return true, nil | ||||
| 	} | ||||
|  | ||||
| 	resultJSON, err := vmcompute.HcsTerminateProcess(ctx, process.handle) | ||||
| 	if err != nil { | ||||
| 		// We still need to check these two cases, as processes may still be killed by an | ||||
| 		// external actor (human operator, OOM, random script etc). | ||||
| 		if errors.Is(err, os.ErrPermission) || IsAlreadyStopped(err) { | ||||
| 			// There are two cases where it should be safe to ignore an error returned | ||||
| 			// by HcsTerminateProcess. The first one is cause by the fact that | ||||
| 			// HcsTerminateProcess ends up calling TerminateProcess in the context | ||||
| 			// of a container. According to the TerminateProcess documentation: | ||||
| 			// https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess#remarks | ||||
| 			// After a process has terminated, call to TerminateProcess with open | ||||
| 			// handles to the process fails with ERROR_ACCESS_DENIED (5) error code. | ||||
| 			// It's safe to ignore this error here. HCS should always have permissions | ||||
| 			// to kill processes inside any container. So an ERROR_ACCESS_DENIED | ||||
| 			// is unlikely to be anything else than what the ending remarks in the | ||||
| 			// documentation states. | ||||
| 			// | ||||
| 			// The second case is generated by hcs itself, if for any reason HcsTerminateProcess | ||||
| 			// is called twice in a very short amount of time. In such cases, hcs may return | ||||
| 			// HCS_E_PROCESS_ALREADY_STOPPED. | ||||
| 			return true, nil | ||||
| 		} | ||||
| 	} | ||||
| 	events := processHcsResult(ctx, resultJSON) | ||||
| 	delivered, err := process.processSignalResult(ctx, err) | ||||
| 	if err != nil { | ||||
| 		err = makeProcessError(process, operation, err, events) | ||||
| 	} | ||||
|  | ||||
| 	process.killSignalDelivered = delivered | ||||
| 	return delivered, err | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										44
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/console.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| package winapi | ||||
|  | ||||
| import ( | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
|  | ||||
| const PSEUDOCONSOLE_INHERIT_CURSOR = 0x1 | ||||
|  | ||||
| // CreatePseudoConsole creates a windows pseudo console. | ||||
| func CreatePseudoConsole(size windows.Coord, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) error { | ||||
| 	// We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand. | ||||
| 	return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), hInput, hOutput, 0, hpcon) | ||||
| } | ||||
|  | ||||
| // ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`. | ||||
| func ResizePseudoConsole(hpcon windows.Handle, size windows.Coord) error { | ||||
| 	// We need this wrapper as the function takes a COORD struct and not a pointer to one, so we need to cast to something beforehand. | ||||
| 	return resizePseudoConsole(hpcon, *((*uint32)(unsafe.Pointer(&size)))) | ||||
| } | ||||
|  | ||||
| // HRESULT WINAPI CreatePseudoConsole( | ||||
| //     _In_ COORD size, | ||||
| //     _In_ HANDLE hInput, | ||||
| //     _In_ HANDLE hOutput, | ||||
| //     _In_ DWORD dwFlags, | ||||
| //     _Out_ HPCON* phPC | ||||
| // ); | ||||
| // | ||||
| //sys createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) = kernel32.CreatePseudoConsole | ||||
|  | ||||
| // void WINAPI ClosePseudoConsole( | ||||
| //     _In_ HPCON hPC | ||||
| // ); | ||||
| // | ||||
| //sys ClosePseudoConsole(hpc windows.Handle) = kernel32.ClosePseudoConsole | ||||
|  | ||||
| // HRESULT WINAPI ResizePseudoConsole( | ||||
| //     _In_ HPCON hPC , | ||||
| //     _In_ COORD size | ||||
| // ); | ||||
| // | ||||
| //sys resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole | ||||
							
								
								
									
										10
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,9 +2,7 @@ package winapi | ||||
|  | ||||
| const PROCESS_ALL_ACCESS uint32 = 2097151 | ||||
|  | ||||
| // DWORD GetProcessImageFileNameW( | ||||
| //	HANDLE hProcess, | ||||
| //	LPWSTR lpImageFileName, | ||||
| //	DWORD  nSize | ||||
| // ); | ||||
| //sys GetProcessImageFileName(hProcess windows.Handle, imageFileName *uint16, nSize uint32) (size uint32, err error) = kernel32.GetProcessImageFileNameW | ||||
| const ( | ||||
| 	PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x20016 | ||||
| 	PROC_THREAD_ATTRIBUTE_JOB_LIST      = 0x2000D | ||||
| ) | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,4 +2,4 @@ | ||||
| // be thought of as an extension to golang.org/x/sys/windows. | ||||
| package winapi | ||||
|  | ||||
| //go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go system.go net.go path.go thread.go iocp.go jobobject.go logon.go memory.go process.go processor.go devices.go filesystem.go errors.go | ||||
| //go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go console.go system.go net.go path.go thread.go iocp.go jobobject.go logon.go memory.go process.go processor.go devices.go filesystem.go errors.go | ||||
|   | ||||
							
								
								
									
										46
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -37,12 +37,15 @@ func errnoErr(e syscall.Errno) error { | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | ||||
| 	modntdll    = windows.NewLazySystemDLL("ntdll.dll") | ||||
| 	modiphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") | ||||
| 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | ||||
| 	modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") | ||||
| 	modcfgmgr32 = windows.NewLazySystemDLL("cfgmgr32.dll") | ||||
|  | ||||
| 	procCreatePseudoConsole                    = modkernel32.NewProc("CreatePseudoConsole") | ||||
| 	procClosePseudoConsole                     = modkernel32.NewProc("ClosePseudoConsole") | ||||
| 	procResizePseudoConsole                    = modkernel32.NewProc("ResizePseudoConsole") | ||||
| 	procNtQuerySystemInformation               = modntdll.NewProc("NtQuerySystemInformation") | ||||
| 	procSetJobCompartmentId                    = modiphlpapi.NewProc("SetJobCompartmentId") | ||||
| 	procSearchPathW                            = modkernel32.NewProc("SearchPathW") | ||||
| @@ -58,7 +61,6 @@ var ( | ||||
| 	procLogonUserW                             = modadvapi32.NewProc("LogonUserW") | ||||
| 	procLocalAlloc                             = modkernel32.NewProc("LocalAlloc") | ||||
| 	procLocalFree                              = modkernel32.NewProc("LocalFree") | ||||
| 	procGetProcessImageFileNameW               = modkernel32.NewProc("GetProcessImageFileNameW") | ||||
| 	procGetActiveProcessorCount                = modkernel32.NewProc("GetActiveProcessorCount") | ||||
| 	procCM_Get_Device_ID_List_SizeA            = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA") | ||||
| 	procCM_Get_Device_ID_ListA                 = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA") | ||||
| @@ -71,6 +73,33 @@ var ( | ||||
| 	procRtlNtStatusToDosError                  = modntdll.NewProc("RtlNtStatusToDosError") | ||||
| ) | ||||
|  | ||||
| func createPseudoConsole(size uint32, hInput windows.Handle, hOutput windows.Handle, dwFlags uint32, hpcon *windows.Handle) (hr error) { | ||||
| 	r0, _, _ := syscall.Syscall6(procCreatePseudoConsole.Addr(), 5, uintptr(size), uintptr(hInput), uintptr(hOutput), uintptr(dwFlags), uintptr(unsafe.Pointer(hpcon)), 0) | ||||
| 	if int32(r0) < 0 { | ||||
| 		if r0&0x1fff0000 == 0x00070000 { | ||||
| 			r0 &= 0xffff | ||||
| 		} | ||||
| 		hr = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func ClosePseudoConsole(hpc windows.Handle) { | ||||
| 	syscall.Syscall(procClosePseudoConsole.Addr(), 1, uintptr(hpc), 0, 0) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) { | ||||
| 	r0, _, _ := syscall.Syscall(procResizePseudoConsole.Addr(), 2, uintptr(hPc), uintptr(size), 0) | ||||
| 	if int32(r0) < 0 { | ||||
| 		if r0&0x1fff0000 == 0x00070000 { | ||||
| 			r0 &= 0xffff | ||||
| 		} | ||||
| 		hr = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func NtQuerySystemInformation(systemInfoClass int, systemInformation uintptr, systemInfoLength uint32, returnLength *uint32) (status uint32) { | ||||
| 	r0, _, _ := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInfoClass), uintptr(systemInformation), uintptr(systemInfoLength), uintptr(unsafe.Pointer(returnLength)), 0, 0) | ||||
| 	status = uint32(r0) | ||||
| @@ -227,19 +256,6 @@ func LocalFree(ptr uintptr) { | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func GetProcessImageFileName(hProcess windows.Handle, imageFileName *uint16, nSize uint32) (size uint32, err error) { | ||||
| 	r0, _, e1 := syscall.Syscall(procGetProcessImageFileNameW.Addr(), 3, uintptr(hProcess), uintptr(unsafe.Pointer(imageFileName)), uintptr(nSize)) | ||||
| 	size = uint32(r0) | ||||
| 	if size == 0 { | ||||
| 		if e1 != 0 { | ||||
| 			err = errnoErr(e1) | ||||
| 		} else { | ||||
| 			err = syscall.EINVAL | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func GetActiveProcessorCount(groupNumber uint16) (amount uint32) { | ||||
| 	r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0) | ||||
| 	amount = uint32(r0) | ||||
|   | ||||
							
								
								
									
										9
									
								
								vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/Microsoft/hcsshim/osversion/windowsbuilds.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -38,4 +38,13 @@ const ( | ||||
|  | ||||
| 	// V21H1 corresponds to Windows Server 21H1 (semi-annual channel). | ||||
| 	V21H1 = 19043 | ||||
|  | ||||
| 	// V21H2Win10 corresponds to Windows 10 (November 2021 Update). | ||||
| 	V21H2Win10 = 19044 | ||||
|  | ||||
| 	// V21H2Server corresponds to Windows Server 2022 (ltsc2022). | ||||
| 	V21H2Server = 20348 | ||||
|  | ||||
| 	// V21H2Win11 corresponds to Windows 11 (original release). | ||||
| 	V21H2Win11 = 22000 | ||||
| ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Daniel Canter
					Daniel Canter