From e988d6c423209864a2e00f333fe66cbddce4ccf1 Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Fri, 26 Apr 2024 15:39:14 -0400 Subject: [PATCH] cmd/cgo/internal/testsanitizers: add test case for #66427 The added program fails consistently with "signal handler spoils errno" error under TSAN. For #66427. Change-Id: Id57b9e62aa30b273a1c793aecd86ec1f211062fc Reviewed-on: https://go-review.googlesource.com/c/go/+/581722 LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Knyszek Reviewed-by: Ian Lance Taylor --- .../testsanitizers/testdata/tsan15.go | 60 +++++++++++++++++++ .../cgo/internal/testsanitizers/tsan_test.go | 1 + 2 files changed, 61 insertions(+) create mode 100644 src/cmd/cgo/internal/testsanitizers/testdata/tsan15.go diff --git a/src/cmd/cgo/internal/testsanitizers/testdata/tsan15.go b/src/cmd/cgo/internal/testsanitizers/testdata/tsan15.go new file mode 100644 index 0000000000..994db52afd --- /dev/null +++ b/src/cmd/cgo/internal/testsanitizers/testdata/tsan15.go @@ -0,0 +1,60 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +// Test case for issue 66427. +// Running under TSAN, this fails with "signal handler +// spoils errno". + +/* +#include +#include +#include + +void go_callback(); + +static void *thr(void *arg) { + int i; + for (i = 0; i < 10; i++) + go_callback(); + return 0; +} + +static void *sendthr(void *arg) { + pthread_t th = *(pthread_t*)arg; + while (1) { + int r = pthread_kill(th, SIGWINCH); + if (r < 0) + break; + } + return 0; +} + +static void foo() { + pthread_t *th = malloc(sizeof(pthread_t)); + pthread_t th2; + pthread_create(th, 0, thr, 0); + pthread_create(&th2, 0, sendthr, th); + pthread_join(*th, 0); +} +*/ +import "C" + +import ( + "time" +) + +//export go_callback +func go_callback() {} + +func main() { + go func() { + for { + C.foo() + } + }() + + time.Sleep(1000 * time.Millisecond) +} diff --git a/src/cmd/cgo/internal/testsanitizers/tsan_test.go b/src/cmd/cgo/internal/testsanitizers/tsan_test.go index 8e758e6ea7..94c00ef7f4 100644 --- a/src/cmd/cgo/internal/testsanitizers/tsan_test.go +++ b/src/cmd/cgo/internal/testsanitizers/tsan_test.go @@ -54,6 +54,7 @@ func TestTSAN(t *testing.T) { {src: "tsan12.go", needsRuntime: true}, {src: "tsan13.go", needsRuntime: true}, {src: "tsan14.go", needsRuntime: true}, + {src: "tsan15.go", needsRuntime: true}, } for _, tc := range cases { tc := tc -- 2.48.1