aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-07-24 17:44:20 +0200
committerAlexander Potapenko <glider@google.com>2024-07-24 15:55:05 +0000
commitd1a1b0ca5ffc870174435e1a6878be98ee02dcd7 (patch)
treeec10501ca3eb3e99c86c0f02062cdb735a021cbf
parent9726361840e010a0c8acaec8c85c9a1c38c7174a (diff)
pkg/runtest: fix a race during startup
Run method usually runs in a separate goroutine concurrently with request consumer (Next calls), so at least executor needs to be initialized before Run. Otherwise we can get episodic nil derefs in Next method.
-rw-r--r--pkg/runtest/run.go9
-rw-r--r--pkg/runtest/run_test.go1
-rw-r--r--syz-manager/manager.go1
3 files changed, 9 insertions, 2 deletions
diff --git a/pkg/runtest/run.go b/pkg/runtest/run.go
index 501f92dd3..e0fefc31a 100644
--- a/pkg/runtest/run.go
+++ b/pkg/runtest/run.go
@@ -63,13 +63,18 @@ type Context struct {
buildSem chan bool
}
+func (ctx *Context) Init() {
+ // Run usually runs in a separate goroutine concurrently with request consumer (Next calls),
+ // so at least executor needs to be initialized before Run.
+ ctx.executor = queue.DynamicOrder()
+ ctx.buildSem = make(chan bool, runtime.GOMAXPROCS(0))
+}
+
func (ctx *Context) log(msg string, args ...interface{}) {
ctx.LogFunc(fmt.Sprintf(msg, args...))
}
func (ctx *Context) Run(waitCtx context.Context) error {
- ctx.buildSem = make(chan bool, runtime.GOMAXPROCS(0))
- ctx.executor = queue.DynamicOrder()
ctx.generatePrograms()
var ok, fail, broken, skip int
for _, req := range ctx.requests {
diff --git a/pkg/runtest/run_test.go b/pkg/runtest/run_test.go
index 0861b7e2b..d0c3ca780 100644
--- a/pkg/runtest/run_test.go
+++ b/pkg/runtest/run_test.go
@@ -85,6 +85,7 @@ func test(t *testing.T, sysTarget *targets.Target) {
Verbose: true,
Debug: *flagDebug,
}
+ ctx.Init()
waitCtx := startRPCServer(t, target, executor, ctx, rpcParams{
manyProcs: true,
machineChecked: func(features flatrpc.Feature) {
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index 367ade170..52d50109e 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -1389,6 +1389,7 @@ func (mgr *Manager) MachineChecked(features flatrpc.Feature, enabledSyscalls map
Verbose: true,
Debug: *flagDebug,
}
+ ctx.Init()
go func() {
err := ctx.Run(context.Background())
if err != nil {