aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/go-patches/0006-Revert-release-branch.go1.15-runtime-detect-services.patch
diff options
context:
space:
mode:
Diffstat (limited to 'go-patches/0006-Revert-release-branch.go1.15-runtime-detect-services.patch')
-rw-r--r--go-patches/0006-Revert-release-branch.go1.15-runtime-detect-services.patch135
1 files changed, 135 insertions, 0 deletions
diff --git a/go-patches/0006-Revert-release-branch.go1.15-runtime-detect-services.patch b/go-patches/0006-Revert-release-branch.go1.15-runtime-detect-services.patch
new file mode 100644
index 00000000..933a8a36
--- /dev/null
+++ b/go-patches/0006-Revert-release-branch.go1.15-runtime-detect-services.patch
@@ -0,0 +1,135 @@
+From e6b4c1b3beb4f843ed40abead27c8132d29a0db8 Mon Sep 17 00:00:00 2001
+From: "Jason A. Donenfeld" <Jason@zx2c4.com>
+Date: Fri, 11 Sep 2020 13:04:11 +0200
+Subject: [PATCH 6/8] Revert "[release-branch.go1.15] runtime: detect services
+ in signal handler"
+
+This reverts commit b1253d24e159129c778377c3a2a0bde15904a417.
+---
+ src/runtime/os_windows.go | 73 +++------------------------------------
+ 1 file changed, 4 insertions(+), 69 deletions(-)
+
+diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go
+index 769197db46..a584ada702 100644
+--- a/src/runtime/os_windows.go
++++ b/src/runtime/os_windows.go
+@@ -36,10 +36,7 @@ const (
+ //go:cgo_import_dynamic runtime._SetThreadContext SetThreadContext%2 "kernel32.dll"
+ //go:cgo_import_dynamic runtime._LoadLibraryW LoadLibraryW%1 "kernel32.dll"
+ //go:cgo_import_dynamic runtime._LoadLibraryA LoadLibraryA%1 "kernel32.dll"
+-//go:cgo_import_dynamic runtime._OpenProcess OpenProcess%3 "kernel32.dll"
+ //go:cgo_import_dynamic runtime._PostQueuedCompletionStatus PostQueuedCompletionStatus%4 "kernel32.dll"
+-//go:cgo_import_dynamic runtime._ProcessIdToSessionId ProcessIdToSessionId%2 "kernel32.dll"
+-//go:cgo_import_dynamic runtime._QueryFullProcessImageNameA QueryFullProcessImageNameA%4 "kernel32.dll"
+ //go:cgo_import_dynamic runtime._ResumeThread ResumeThread%1 "kernel32.dll"
+ //go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 "kernel32.dll"
+ //go:cgo_import_dynamic runtime._SetErrorMode SetErrorMode%1 "kernel32.dll"
+@@ -87,10 +84,7 @@ var (
+ _SetThreadContext,
+ _LoadLibraryW,
+ _LoadLibraryA,
+- _OpenProcess,
+ _PostQueuedCompletionStatus,
+- _ProcessIdToSessionId,
+- _QueryFullProcessImageNameA,
+ _QueryPerformanceCounter,
+ _QueryPerformanceFrequency,
+ _ResumeThread,
+@@ -134,8 +128,7 @@ var (
+ // Load ntdll.dll manually during startup, otherwise Mingw
+ // links wrong printf function to cgo executable (see issue
+ // 12030 for details).
+- _NtWaitForSingleObject stdFunction
+- _NtQueryInformationProcess stdFunction
++ _NtWaitForSingleObject stdFunction
+
+ // These are from non-kernel32.dll, so we prefer to LoadLibraryEx them.
+ _timeBeginPeriod,
+@@ -262,7 +255,6 @@ func loadOptionalSyscalls() {
+ throw("ntdll.dll not found")
+ }
+ _NtWaitForSingleObject = windowsFindfunc(n32, []byte("NtWaitForSingleObject\000"))
+- _NtQueryInformationProcess = windowsFindfunc(n32, []byte("NtQueryInformationProcess\000"))
+
+ if GOARCH == "arm" {
+ _QueryPerformanceCounter = windowsFindfunc(k32, []byte("QueryPerformanceCounter\000"))
+@@ -1003,63 +995,6 @@ func usleep(us uint32) {
+ onosstack(usleep2Addr, 10*us)
+ }
+
+-// isWindowsService returns whether the process is currently executing as a
+-// Windows service. The below technique looks a bit hairy, but it's actually
+-// exactly what the .NET framework does for the similarly named function:
+-// https://github.com/dotnet/extensions/blob/f4066026ca06984b07e90e61a6390ac38152ba93/src/Hosting/WindowsServices/src/WindowsServiceHelpers.cs#L26-L31
+-// Specifically, it looks up whether the parent process has session ID zero
+-// and is called "services".
+-func isWindowsService() bool {
+- const (
+- _CURRENT_PROCESS = ^uintptr(0)
+- _PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
+- )
+- // pbi is a PROCESS_BASIC_INFORMATION struct, where we just care about
+- // the 6th pointer inside of it, which contains the pid of the process
+- // parent:
+- // https://github.com/wine-mirror/wine/blob/42cb7d2ad1caba08de235e6319b9967296b5d554/include/winternl.h#L1294
+- var pbi [6]uintptr
+- var pbiLen uint32
+- err := stdcall5(_NtQueryInformationProcess, _CURRENT_PROCESS, 0, uintptr(unsafe.Pointer(&pbi[0])), uintptr(unsafe.Sizeof(pbi)), uintptr(unsafe.Pointer(&pbiLen)))
+- if err != 0 {
+- return false
+- }
+- var psid uint32
+- err = stdcall2(_ProcessIdToSessionId, pbi[5], uintptr(unsafe.Pointer(&psid)))
+- if err == 0 || psid != 0 {
+- return false
+- }
+- pproc := stdcall3(_OpenProcess, _PROCESS_QUERY_LIMITED_INFORMATION, 0, pbi[5])
+- if pproc == 0 {
+- return false
+- }
+- defer stdcall1(_CloseHandle, pproc)
+- // exeName gets the path to the executable image of the parent process
+- var exeName [261]byte
+- exeNameLen := uint32(len(exeName) - 1)
+- err = stdcall4(_QueryFullProcessImageNameA, pproc, 0, uintptr(unsafe.Pointer(&exeName[0])), uintptr(unsafe.Pointer(&exeNameLen)))
+- if err == 0 || exeNameLen == 0 {
+- return false
+- }
+- servicesLower := "services.exe"
+- servicesUpper := "SERVICES.EXE"
+- i := int(exeNameLen) - 1
+- j := len(servicesLower) - 1
+- if i < j {
+- return false
+- }
+- for {
+- if j == -1 {
+- return i == -1 || exeName[i] == '\\'
+- }
+- if exeName[i] != servicesLower[j] && exeName[i] != servicesUpper[j] {
+- return false
+- }
+- i--
+- j--
+- }
+-}
+-
+ func ctrlhandler1(_type uint32) uint32 {
+ var s uint32
+
+@@ -1075,9 +1010,9 @@ func ctrlhandler1(_type uint32) uint32 {
+ if sigsend(s) {
+ return 1
+ }
+- if !islibrary && !isarchive && !isWindowsService() {
+- // Only exit the program if we don't have a DLL or service.
+- // See https://golang.org/issues/35965 and https://golang.org/issues/40167
++ if !islibrary && !isarchive {
++ // Only exit the program if we don't have a DLL.
++ // See https://golang.org/issues/35965.
+ exit(2) // SIGINT, SIGTERM, etc
+ }
+ return 0
+--
+2.29.1
+