Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package go1.24 for openSUSE:Factory checked in at 2025-04-23 15:17:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/go1.24 (Old) and /work/SRC/openSUSE:Factory/.go1.24.new.30101 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "go1.24" Wed Apr 23 15:17:59 2025 rev:7 rq:1272001 version:1.24.2 Changes: -------- --- /work/SRC/openSUSE:Factory/go1.24/go1.24.changes 2025-04-03 18:43:58.642216407 +0200 +++ /work/SRC/openSUSE:Factory/.go1.24.new.30101/go1.24.changes 2025-04-23 15:17:59.814751139 +0200 @@ -1,0 +2,5 @@ +Mon Apr 21 13:20:21 UTC 2025 - Georg Pfuetzenreuter <mail+...@georg-pfuetzenreuter.net> + +- Add gh-issue-73141.patch to repair random segmentation faults (boo#1240764) + +------------------------------------------------------------------- New: ---- gh-issue-73141.patch BETA DEBUG BEGIN: New: - Add gh-issue-73141.patch to repair random segmentation faults (boo#1240764) BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ go1.24.spec ++++++ --- /var/tmp/diff_new_pack.Z2S6OV/_old 2025-04-23 15:18:00.478778913 +0200 +++ /var/tmp/diff_new_pack.Z2S6OV/_new 2025-04-23 15:18:00.482779081 +0200 @@ -141,6 +141,8 @@ # PATCH-FIX-UPSTREAM marguer...@opensuse.org - find /usr/bin/go-8 when bootstrapping with gcc8-go Patch8: gcc-go.patch Patch9: go-fixseccomp.patch +# PATCH-FIX-UPSTREAM https://github.com/golang/go/issues/73141 https://go-review.googlesource.com/c/go/+/662455 +Patch10: gh-issue-73141.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build # boostrap %if %{with gccgo} @@ -244,6 +246,8 @@ %patch -P 8 -p1 %endif +%patch -P 10 -p1 + cp %{SOURCE4} . %build ++++++ gh-issue-73141.patch ++++++ >From 0b31e6d4cc804ab76ae8ced151ee2f50657aec14 Mon Sep 17 00:00:00 2001 From: Michael Pratt <mpr...@google.com> Date: Thu, 3 Apr 2025 03:26:25 +0000 Subject: [PATCH] runtime: cleanup M vgetrandom state before dropping P When an M is destroyed, we put its vgetrandom state back on the shared list for another M to reuse. This list is simply a slice, so appending to the slice may allocate. Currently this operation is performed in mdestroy, after the P is released, meaning allocation is not allowed. More the cleanup earlier in mdestroy when allocation is still OK. Also add //go:nowritebarrierrec to mdestroy since it runs without a P, which would have caught this bug. Fixes #73141. Change-Id: I6a6a636c3fbf5c6eec09d07a260e39dbb4d2db12 Reviewed-on: https://go-review.googlesource.com/c/go/+/662455 Reviewed-by: Jason Donenfeld <ja...@zx2c4.com> LUCI-TryBot-Result: Go LUCI <golang-sco...@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <k...@golang.org> Reviewed-by: Keith Randall <k...@google.com> --- src/runtime/os3_solaris.go | 5 ++++- src/runtime/os_aix.go | 5 ++++- src/runtime/os_darwin.go | 5 ++++- src/runtime/os_dragonfly.go | 5 ++++- src/runtime/os_linux.go | 9 ++++----- src/runtime/os_netbsd.go | 5 ++++- src/runtime/os_openbsd.go | 5 ++++- src/runtime/os_plan9.go | 5 ++++- src/runtime/os_windows.go | 4 +++- src/runtime/proc.go | 3 +++ src/runtime/vgetrandom_linux.go | 11 +++++++++-- src/runtime/vgetrandom_unsupported.go | 2 +- 12 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go index cf163a6bf401f6..ded821b2e66f81 100644 --- a/src/runtime/os3_solaris.go +++ b/src/runtime/os3_solaris.go @@ -234,8 +234,11 @@ func unminit() { getg().m.procid = 0 } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { } diff --git a/src/runtime/os_aix.go b/src/runtime/os_aix.go index 93464cb997f3be..1b483c2a7e9856 100644 --- a/src/runtime/os_aix.go +++ b/src/runtime/os_aix.go @@ -186,8 +186,11 @@ func unminit() { getg().m.procid = 0 } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { } diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go index 0ecbea7ae47c60..6eab3b5c3ddba6 100644 --- a/src/runtime/os_darwin.go +++ b/src/runtime/os_darwin.go @@ -344,8 +344,11 @@ func unminit() { getg().m.procid = 0 } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { } diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go index a02696eb4f566d..9b3235084d7c4f 100644 --- a/src/runtime/os_dragonfly.go +++ b/src/runtime/os_dragonfly.go @@ -216,8 +216,11 @@ func unminit() { getg().m.procid = 0 } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { } diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 55c4ac8f61f9c6..f24d18027be8af 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -412,13 +412,12 @@ func unminit() { getg().m.procid = 0 } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { - if mp.vgetrandomState != 0 { - vgetrandomPutState(mp.vgetrandomState) - mp.vgetrandomState = 0 - } } // #ifdef GOARCH_386 diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index 735ace25adb3b3..a06e5febbd5a75 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -320,8 +320,11 @@ func unminit() { // must continue working after unminit. } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { } diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 574bfa8b1708be..4ce4c3c58d35df 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -182,8 +182,11 @@ func unminit() { getg().m.procid = 0 } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { } diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go index b45e409b3a4059..6ddf1d21d4a385 100644 --- a/src/runtime/os_plan9.go +++ b/src/runtime/os_plan9.go @@ -218,8 +218,11 @@ func minit() { func unminit() { } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. +// +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec func mdestroy(mp *m) { } diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 489b396fc9c45a..a84832e0ce3555 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -905,9 +905,11 @@ func unminit() { mp.procid = 0 } -// Called from exitm, but not from drop, to undo the effect of thread-owned +// Called from mexit, but not from dropm, to undo the effect of thread-owned // resources in minit, semacreate, or elsewhere. Do not take locks after calling this. // +// This always runs without a P, so //go:nowritebarrierrec is required. +//go:nowritebarrierrec //go:nosplit func mdestroy(mp *m) { if mp.highResTimer != 0 { diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 74c19e9e435bf8..cee91b6ce85d57 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1958,6 +1958,9 @@ func mexit(osStack bool) { mp.gsignal = nil } + // Free vgetrandom state. + vgetrandomDestroy(mp) + // Remove m from allm. lock(&sched.lock) for pprev := &allm; *pprev != nil; pprev = &(*pprev).alllink { diff --git a/src/runtime/vgetrandom_linux.go b/src/runtime/vgetrandom_linux.go index 00ef2c2d4ee623..6ab12e3c67b07a 100644 --- a/src/runtime/vgetrandom_linux.go +++ b/src/runtime/vgetrandom_linux.go @@ -74,9 +74,16 @@ func vgetrandomGetState() uintptr { return state } -func vgetrandomPutState(state uintptr) { +// Free vgetrandom state from the M (if any) prior to destroying the M. +// +// This may allocate, so it must have a P. +func vgetrandomDestroy(mp *m) { + if mp.vgetrandomState == 0 { + return + } + lock(&vgetrandomAlloc.statesLock) - vgetrandomAlloc.states = append(vgetrandomAlloc.states, state) + vgetrandomAlloc.states = append(vgetrandomAlloc.states, mp.vgetrandomState) unlock(&vgetrandomAlloc.statesLock) } diff --git a/src/runtime/vgetrandom_unsupported.go b/src/runtime/vgetrandom_unsupported.go index 070392cfaaf7a9..43c53e1198843c 100644 --- a/src/runtime/vgetrandom_unsupported.go +++ b/src/runtime/vgetrandom_unsupported.go @@ -13,6 +13,6 @@ func vgetrandom(p []byte, flags uint32) (ret int, supported bool) { return -1, false } -func vgetrandomPutState(state uintptr) {} +func vgetrandomDestroy(mp *m) {} func vgetrandomInit() {}