mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: be careful about crash FD changes during panic
There are two separate cases here: The base case is simple: a concurrent call to SetCrashOutput while panicking will switch the crash FD, which could cause the first half of writes to go to the old FD, and the second half to the new FD. This isn't a correctness problem, but would be annoying to see in practice. Since it is easy to check for, I simply drop any changes if panicking is already in progress. The second case is more important: SetCrashOutput will close the old FD after the new FD is swapped, but writeErrData has no locking around use of the fd, so SetCrashOutput could close the FD out from under writeErrData, causing lost writes. We handle this similarly, by not allowing SetCrashOutput to close the old FD if a panic is in progress, but we have to be more careful about synchronization between writeErrData and setCrashFD to ensure that writeErrData can't observe the old FD while setCrashFD allows close. For #42888. Change-Id: I7270b2cc5ea58a15ba40145b7a96d557acdfe842 Reviewed-on: https://go-review.googlesource.com/c/go/+/559801 Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Michael Pratt <mpratt@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
7fd62ba821
commit
638b9023e3
2 changed files with 38 additions and 1 deletions
|
|
@ -38,6 +38,8 @@ func Stack() []byte {
|
|||
// SetCrashOutput duplicates f's file descriptor, so the caller may safely
|
||||
// close f as soon as SetCrashOutput returns.
|
||||
// To disable this additional crash output, call SetCrashOutput(nil).
|
||||
// If called concurrently with a crash, some in-progress output may be written
|
||||
// to the old file even after an overriding SetCrashOutput returns.
|
||||
func SetCrashOutput(f *os.File) error {
|
||||
fd := ^uintptr(0)
|
||||
if f != nil {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue