aboutsummaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-06-15 01:55:50 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-06-15 10:11:46 +0000
commit4061d3463bb02def972e24aff173b0e5f98c0c3d (patch)
tree6143a47cef57a23a0db2e956c970d6a3978b183b /src/syscall
parentcf4e3e3d3b3a713ec4df7e995d5bf5caef045a09 (diff)
downloadgo-4061d3463bb02def972e24aff173b0e5f98c0c3d.tar.gz
go-4061d3463bb02def972e24aff173b0e5f98c0c3d.zip
syscall: rewrite handle inheritance test to use C rather than Powershell
In CL 327210, we disabled this test on arm platforms, because the powershell shipped with those systems isn't native, which means it'd refuse to load native DLLs. This commit rewrites the test to simply not use Powershell, and instead compiles a trivial C program that tests for the same thing. Reverting CL 316269 makes this test fail, as desired, while applying it makes this test succeed. Fixes #46701 Change-Id: If39612c57bf74c63adf58e2c49b5cb739b461fe5 Reviewed-on: https://go-review.googlesource.com/c/go/+/327969 Trust: Jason A. Donenfeld <Jason@zx2c4.com> Trust: Alex Brainman <alex.brainman@gmail.com> Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/syscall_windows_test.go38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/syscall/syscall_windows_test.go b/src/syscall/syscall_windows_test.go
index 3243952ded..581a246cd9 100644
--- a/src/syscall/syscall_windows_test.go
+++ b/src/syscall/syscall_windows_test.go
@@ -10,7 +10,6 @@ import (
"os"
"os/exec"
"path/filepath"
- "runtime"
"strings"
"syscall"
"testing"
@@ -80,9 +79,6 @@ func TestTOKEN_ALL_ACCESS(t *testing.T) {
func TestStdioAreInheritable(t *testing.T) {
testenv.MustHaveGoBuild(t)
testenv.MustHaveExecPath(t, "gcc")
- if runtime.GOARCH == "arm64" || runtime.GOARCH == "arm" {
- t.Skip("Powershell is not native on ARM; see golang.org/issues/46701")
- }
tmpdir := t.TempDir()
@@ -114,18 +110,28 @@ func main() {}
t.Fatalf("failed to build go library: %s\n%s", err, out)
}
- // run powershell script
- psscript := fmt.Sprintf(`
-hostname;
-$signature = " [DllImport("%q")] public static extern void HelloWorld(); ";
-Add-Type -MemberDefinition $signature -Name World -Namespace Hello;
-[Hello.World]::HelloWorld();
-hostname;
-`, dll)
- psscript = strings.ReplaceAll(psscript, "\n", "")
- out, err = exec.Command("powershell", "-Command", psscript).CombinedOutput()
+ // build c exe
+ const exetext = `
+#include <stdlib.h>
+#include <windows.h>
+int main(int argc, char *argv[])
+{
+ system("hostname");
+ ((void(*)(void))GetProcAddress(LoadLibraryA(%q), "HelloWorld"))();
+ system("hostname");
+ return 0;
+}
+`
+ exe := filepath.Join(tmpdir, "helloworld.exe")
+ cmd = exec.Command("gcc", "-o", exe, "-xc", "-")
+ cmd.Stdin = strings.NewReader(fmt.Sprintf(exetext, dll))
+ out, err = testenv.CleanCmdEnv(cmd).CombinedOutput()
+ if err != nil {
+ t.Fatalf("failed to build c executable: %s\n%s", err, out)
+ }
+ out, err = exec.Command(exe).CombinedOutput()
if err != nil {
- t.Fatalf("Powershell command failed: %v: %v", err, string(out))
+ t.Fatalf("c program execution failed: %v: %v", err, string(out))
}
hostname, err := os.Hostname()
@@ -137,6 +143,6 @@ hostname;
have = strings.ReplaceAll(have, "\r", "")
want := fmt.Sprintf("%sHello World%s", hostname, hostname)
if have != want {
- t.Fatalf("Powershell command output is wrong: got %q, want %q", have, want)
+ t.Fatalf("c program output is wrong: got %q, want %q", have, want)
}
}