mirror of https://github.com/golang/go.git
os/user: test that Current does not depend on netapi32.dll
Updates #21867. Change-Id: I1eb923ef66aa0f338bfa0d683159edc1d8ae2a6c Reviewed-on: https://go-review.googlesource.com/c/go/+/604415 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Alex Brainman <alex.brainman@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
36b45bca66
commit
5d82dbb59c
|
|
@ -500,3 +500,5 @@ func QueryPerformanceCounter() int64 // Implemented in runtime package.
|
||||||
//
|
//
|
||||||
//go:linkname QueryPerformanceFrequency
|
//go:linkname QueryPerformanceFrequency
|
||||||
func QueryPerformanceFrequency() int64 // Implemented in runtime package.
|
func QueryPerformanceFrequency() int64 // Implemented in runtime package.
|
||||||
|
|
||||||
|
//sys GetModuleHandle(modulename *uint16) (handle syscall.Handle, err error) = kernel32.GetModuleHandleW
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ var (
|
||||||
procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx")
|
procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx")
|
||||||
procGetFinalPathNameByHandleW = modkernel32.NewProc("GetFinalPathNameByHandleW")
|
procGetFinalPathNameByHandleW = modkernel32.NewProc("GetFinalPathNameByHandleW")
|
||||||
procGetModuleFileNameW = modkernel32.NewProc("GetModuleFileNameW")
|
procGetModuleFileNameW = modkernel32.NewProc("GetModuleFileNameW")
|
||||||
|
procGetModuleHandleW = modkernel32.NewProc("GetModuleHandleW")
|
||||||
procGetTempPath2W = modkernel32.NewProc("GetTempPath2W")
|
procGetTempPath2W = modkernel32.NewProc("GetTempPath2W")
|
||||||
procGetVolumeInformationByHandleW = modkernel32.NewProc("GetVolumeInformationByHandleW")
|
procGetVolumeInformationByHandleW = modkernel32.NewProc("GetVolumeInformationByHandleW")
|
||||||
procGetVolumeNameForVolumeMountPointW = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW")
|
procGetVolumeNameForVolumeMountPointW = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW")
|
||||||
|
|
@ -287,6 +288,15 @@ func GetModuleFileName(module syscall.Handle, fn *uint16, len uint32) (n uint32,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetModuleHandle(modulename *uint16) (handle syscall.Handle, err error) {
|
||||||
|
r0, _, e1 := syscall.Syscall(procGetModuleHandleW.Addr(), 1, uintptr(unsafe.Pointer(modulename)), 0, 0)
|
||||||
|
handle = syscall.Handle(r0)
|
||||||
|
if handle == 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetTempPath2(buflen uint32, buf *uint16) (n uint32, err error) {
|
func GetTempPath2(buflen uint32, buf *uint16) (n uint32, err error) {
|
||||||
r0, _, e1 := syscall.Syscall(procGetTempPath2W.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
|
r0, _, e1 := syscall.Syscall(procGetTempPath2W.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
|
||||||
n = uint32(r0)
|
n = uint32(r0)
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,11 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"internal/syscall/windows"
|
"internal/syscall/windows"
|
||||||
|
"internal/testenv"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
@ -143,3 +147,37 @@ func TestImpersonated(t *testing.T) {
|
||||||
}
|
}
|
||||||
compare(t, want, got)
|
compare(t, want, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCurrentNetapi32(t *testing.T) {
|
||||||
|
if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
|
||||||
|
// Test that Current does not load netapi32.dll.
|
||||||
|
// First call Current.
|
||||||
|
Current()
|
||||||
|
|
||||||
|
// Then check if netapi32.dll is loaded.
|
||||||
|
netapi32, err := syscall.UTF16PtrFromString("netapi32.dll")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "error: %s\n", err.Error())
|
||||||
|
os.Exit(9)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mod, _ := windows.GetModuleHandle(netapi32)
|
||||||
|
if mod != 0 {
|
||||||
|
fmt.Fprintf(os.Stderr, "netapi32.dll is loaded\n")
|
||||||
|
os.Exit(9)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
exe, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
cmd := testenv.CleanCmdEnv(exec.Command(exe, "-test.run=^TestCurrentNetapi32$"))
|
||||||
|
cmd.Env = append(cmd.Env, "GO_WANT_HELPER_PROCESS=1")
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%v\n%s", err, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue