]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check if mp.curg is nil before readgstatus in writeProcStatusForP
authorMichael Anthony Knyszek <mknyszek@google.com>
Fri, 1 Dec 2023 21:05:34 +0000 (21:05 +0000)
committerMichael Knyszek <mknyszek@google.com>
Fri, 1 Dec 2023 21:36:00 +0000 (21:36 +0000)
CL 546025 failed to check if mp.curg is nil, causing all sorts of
failures. It can very well be nil in this context.

For #64318.
Fixes #64507.

Change-Id: I4a95c3fa16d5e1dee8041394c4bdb9c6ba04f032
Reviewed-on: https://go-review.googlesource.com/c/go/+/546636
Reviewed-by: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/runtime/trace2status.go

index c4a0eced8c42ab85ce75d3fb86da9401614d1f54..a4a89051966d953673e2b6ac33a4e31a6f25d42b 100644 (file)
@@ -88,7 +88,7 @@ func (w traceWriter) writeProcStatusForP(pp *p, inSTW bool) traceWriter {
                // but it still owns the P (it's not in _Psyscall yet). The goroutine entering
                // _Gsyscall is the tracer's signal that the P its bound to is also in a syscall,
                // so we need to emit a status that matches. See #64318.
-               if w.mp.p.ptr() == pp && readgstatus(w.mp.curg)&^_Gscan == _Gsyscall {
+               if w.mp.p.ptr() == pp && w.mp.curg != nil && readgstatus(w.mp.curg)&^_Gscan == _Gsyscall {
                        status = traceProcSyscall
                }
        case _Psyscall: