]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: allow builtin write function to be redirected with function pointer
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 3 Dec 2020 12:29:58 +0000 (13:29 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 4 Nov 2021 14:17:18 +0000 (14:17 +0000)
The x/sys/windows package currently uses go:linkname for other facilities
inside of runtime that are not suitable to be exposed as a public API
due to their dangers but are still necessary for manipulating any
low-level plumbing that the runtime controls.

Logging, via the built-in println and panic handler, is one such
low-level plumbing feature. In this case, x/sys/windows/svc needs to be
able to redirect panics to the Windows event log. Because the event log
is a complicated interface, this requires a bit more fiddling than the
simple solution used on Android (baking it into runtime itself), and
because Windows services are very diverse, the event log might not even
always be a desirable destination.

This commit accomplishes this by exposing a function pointer called
"overrideWrite" that low-level runtime packages like x/sys/windows/svc
can use to redirect output logs toward the event log or otherwise.

It is not safe or acceptable to use as a generic mechanism, and for that
reason, we wouldn't want to expose this as a real stable API, similar to
the other instances of go:linkname in x/sys/windows. But for packages
that must interoperate with low-level Go runtime fundamentals, this is a
safety hatch for packages that are developed in tandem with the runtime.
x/sys/windows is one such package.

Updates #42888.

Change-Id: I77a32ff7e1494324e8cc38e792e007f86d32672d
Reviewed-on: https://go-review.googlesource.com/c/go/+/278792
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/runtime/time_nofake.go

index 2b85c5aa014bc7703c932d6c761391a002a22769..70a2102b22e84c2f43c904a1bb302823220363c3 100644 (file)
@@ -19,9 +19,14 @@ func nanotime() int64 {
        return nanotime1()
 }
 
+var overrideWrite func(fd uintptr, p unsafe.Pointer, n int32) int32
+
 // write must be nosplit on Windows (see write1)
 //
 //go:nosplit
 func write(fd uintptr, p unsafe.Pointer, n int32) int32 {
+       if overrideWrite != nil {
+               return overrideWrite(fd, noescape(p), n)
+       }
        return write1(fd, p, n)
 }