diff options
author | Alex Brainman <alex.brainman@gmail.com> | 2015-05-22 10:58:57 +1000 |
---|---|---|
committer | Alex Brainman <alex.brainman@gmail.com> | 2015-06-29 02:45:45 +0000 |
commit | 85d4d46f3cefceb87924ad1b0acec9f753413736 (patch) | |
tree | 30455427e19e41a0b87893ebbdd6cf0f05252dd1 /src/runtime/syscall_windows.go | |
parent | 3b7841b3aff9204f054ffabbe4dd39d3e3dd3e91 (diff) | |
download | go-85d4d46f3cefceb87924ad1b0acec9f753413736.tar.gz go-85d4d46f3cefceb87924ad1b0acec9f753413736.zip |
runtime: store syscall parameters in m not on stack
Stack can move during callback, so libcall struct cannot be stored on stack.
asmstdcall updates return values and errno in libcall struct parameter, but
these could be at different location when callback returns.
Store these in m, so they are not affected by GC.
Fixes #10406
Change-Id: Id01c9d2b4b44530494e6d9e9e1c875261ce477cd
Reviewed-on: https://go-review.googlesource.com/10370
Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/runtime/syscall_windows.go')
-rw-r--r-- | src/runtime/syscall_windows.go | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/src/runtime/syscall_windows.go b/src/runtime/syscall_windows.go index d2e44d761a..8e069cdb15 100644 --- a/src/runtime/syscall_windows.go +++ b/src/runtime/syscall_windows.go @@ -91,11 +91,11 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) { //go:linkname syscall_loadlibrary syscall.loadlibrary //go:nosplit func syscall_loadlibrary(filename *uint16) (handle, err uintptr) { - var c libcall + c := &getg().m.syscall c.fn = getLoadLibrary() c.n = 1 - c.args = uintptr(unsafe.Pointer(&filename)) - cgocall(asmstdcallAddr, unsafe.Pointer(&c)) + c.args = uintptr(noescape(unsafe.Pointer(&filename))) + cgocall(asmstdcallAddr, unsafe.Pointer(c)) handle = c.r1 if handle == 0 { err = c.err @@ -106,11 +106,11 @@ func syscall_loadlibrary(filename *uint16) (handle, err uintptr) { //go:linkname syscall_getprocaddress syscall.getprocaddress //go:nosplit func syscall_getprocaddress(handle uintptr, procname *byte) (outhandle, err uintptr) { - var c libcall + c := &getg().m.syscall c.fn = getGetProcAddress() c.n = 2 - c.args = uintptr(unsafe.Pointer(&handle)) - cgocall(asmstdcallAddr, unsafe.Pointer(&c)) + c.args = uintptr(noescape(unsafe.Pointer(&handle))) + cgocall(asmstdcallAddr, unsafe.Pointer(c)) outhandle = c.r1 if outhandle == 0 { err = c.err @@ -121,54 +121,54 @@ func syscall_getprocaddress(handle uintptr, procname *byte) (outhandle, err uint //go:linkname syscall_Syscall syscall.Syscall //go:nosplit func syscall_Syscall(fn, nargs, a1, a2, a3 uintptr) (r1, r2, err uintptr) { - var c libcall + c := &getg().m.syscall c.fn = fn c.n = nargs - c.args = uintptr(unsafe.Pointer(&a1)) - cgocall(asmstdcallAddr, unsafe.Pointer(&c)) + c.args = uintptr(noescape(unsafe.Pointer(&a1))) + cgocall(asmstdcallAddr, unsafe.Pointer(c)) return c.r1, c.r2, c.err } //go:linkname syscall_Syscall6 syscall.Syscall6 //go:nosplit func syscall_Syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { - var c libcall + c := &getg().m.syscall c.fn = fn c.n = nargs - c.args = uintptr(unsafe.Pointer(&a1)) - cgocall(asmstdcallAddr, unsafe.Pointer(&c)) + c.args = uintptr(noescape(unsafe.Pointer(&a1))) + cgocall(asmstdcallAddr, unsafe.Pointer(c)) return c.r1, c.r2, c.err } //go:linkname syscall_Syscall9 syscall.Syscall9 //go:nosplit func syscall_Syscall9(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr) { - var c libcall + c := &getg().m.syscall c.fn = fn c.n = nargs - c.args = uintptr(unsafe.Pointer(&a1)) - cgocall(asmstdcallAddr, unsafe.Pointer(&c)) + c.args = uintptr(noescape(unsafe.Pointer(&a1))) + cgocall(asmstdcallAddr, unsafe.Pointer(c)) return c.r1, c.r2, c.err } //go:linkname syscall_Syscall12 syscall.Syscall12 //go:nosplit func syscall_Syscall12(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) (r1, r2, err uintptr) { - var c libcall + c := &getg().m.syscall c.fn = fn c.n = nargs - c.args = uintptr(unsafe.Pointer(&a1)) - cgocall(asmstdcallAddr, unsafe.Pointer(&c)) + c.args = uintptr(noescape(unsafe.Pointer(&a1))) + cgocall(asmstdcallAddr, unsafe.Pointer(c)) return c.r1, c.r2, c.err } //go:linkname syscall_Syscall15 syscall.Syscall15 //go:nosplit func syscall_Syscall15(fn, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2, err uintptr) { - var c libcall + c := &getg().m.syscall c.fn = fn c.n = nargs - c.args = uintptr(unsafe.Pointer(&a1)) - cgocall(asmstdcallAddr, unsafe.Pointer(&c)) + c.args = uintptr(noescape(unsafe.Pointer(&a1))) + cgocall(asmstdcallAddr, unsafe.Pointer(c)) return c.r1, c.r2, c.err } |