From 15846cbccf63a4e74cce5b8cf0c1931fdcf81ccd Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 15 May 2024 15:17:16 +0200 Subject: pkg/ipc: use flatrpc flags Flatrpc flags are passed in RPC execution requests, so to avoid conversions and duplicate set of flags use flatrpc flags in pkg/ipc directly. --- pkg/fuzzer/fuzzer.go | 5 +++-- pkg/fuzzer/fuzzer_test.go | 7 ++++--- pkg/fuzzer/job.go | 17 +++++++++-------- pkg/fuzzer/queue/queue.go | 7 ++++--- 4 files changed, 20 insertions(+), 16 deletions(-) (limited to 'pkg/fuzzer') diff --git a/pkg/fuzzer/fuzzer.go b/pkg/fuzzer/fuzzer.go index eaedc951d..92b4c8bf1 100644 --- a/pkg/fuzzer/fuzzer.go +++ b/pkg/fuzzer/fuzzer.go @@ -12,6 +12,7 @@ import ( "time" "github.com/google/syzkaller/pkg/corpus" + "github.com/google/syzkaller/pkg/flatrpc" "github.com/google/syzkaller/pkg/fuzzer/queue" "github.com/google/syzkaller/pkg/ipc" "github.com/google/syzkaller/pkg/stats" @@ -121,7 +122,7 @@ func (fuzzer *Fuzzer) processResult(req *queue.Request, res *queue.Result, flags // We do it before unblocking the waiting threads because // it may result it concurrent modification of req.Prog. // If we are already triaging this exact prog, this is flaky coverage. - if req.ExecOpts.ExecFlags&ipc.FlagCollectSignal > 0 && res.Info != nil && !inTriage { + if req.ExecOpts.ExecFlags&flatrpc.ExecFlagCollectSignal > 0 && res.Info != nil && !inTriage { for call, info := range res.Info.Calls { fuzzer.triageProgCall(req.Prog, &info, call, flags) } @@ -325,7 +326,7 @@ func (fuzzer *Fuzzer) RotateMaxSignal(items int) { fuzzer.Cover.subtract(delta) } -func setFlags(execFlags ipc.ExecFlags) ipc.ExecOpts { +func setFlags(execFlags flatrpc.ExecFlag) ipc.ExecOpts { return ipc.ExecOpts{ ExecFlags: execFlags, } diff --git a/pkg/fuzzer/fuzzer_test.go b/pkg/fuzzer/fuzzer_test.go index f358aacab..cb58a4e10 100644 --- a/pkg/fuzzer/fuzzer_test.go +++ b/pkg/fuzzer/fuzzer_test.go @@ -18,6 +18,7 @@ import ( "github.com/google/syzkaller/pkg/corpus" "github.com/google/syzkaller/pkg/csource" + "github.com/google/syzkaller/pkg/flatrpc" "github.com/google/syzkaller/pkg/fuzzer/queue" "github.com/google/syzkaller/pkg/ipc" "github.com/google/syzkaller/pkg/ipc/ipcconfig" @@ -190,10 +191,10 @@ func emulateExec(req *queue.Request) (*queue.Result, string, error) { cover := uint32(call.Meta.ID*1024) + crc32.Checksum(serializedLines[i], crc32q)%4 callInfo := ipc.CallInfo{} - if req.ExecOpts.ExecFlags&ipc.FlagCollectCover > 0 { + if req.ExecOpts.ExecFlags&flatrpc.ExecFlagCollectCover > 0 { callInfo.Cover = []uint32{cover} } - if req.ExecOpts.ExecFlags&ipc.FlagCollectSignal > 0 { + if req.ExecOpts.ExecFlags&flatrpc.ExecFlagCollectSignal > 0 { callInfo.Signal = []uint32{cover} } info.Calls = append(info.Calls, callInfo) @@ -285,7 +286,7 @@ func newProc(t *testing.T, target *prog.Target, executor string) *executorProc { t.Fatal(err) } config.Executor = executor - execOpts.EnvFlags |= ipc.FlagSignal + execOpts.EnvFlags |= flatrpc.ExecEnvSignal env, err := ipc.MakeEnv(config, 0) if err != nil { t.Fatal(err) diff --git a/pkg/fuzzer/job.go b/pkg/fuzzer/job.go index 174acdc52..4e605f1c2 100644 --- a/pkg/fuzzer/job.go +++ b/pkg/fuzzer/job.go @@ -9,6 +9,7 @@ import ( "github.com/google/syzkaller/pkg/corpus" "github.com/google/syzkaller/pkg/cover" + "github.com/google/syzkaller/pkg/flatrpc" "github.com/google/syzkaller/pkg/fuzzer/queue" "github.com/google/syzkaller/pkg/ipc" "github.com/google/syzkaller/pkg/signal" @@ -35,7 +36,7 @@ func genProgRequest(fuzzer *Fuzzer, rnd *rand.Rand) *queue.Request { fuzzer.ChoiceTable()) return &queue.Request{ Prog: p, - ExecOpts: setFlags(ipc.FlagCollectSignal), + ExecOpts: setFlags(flatrpc.ExecFlagCollectSignal), Stat: fuzzer.statExecGenerate, } } @@ -54,7 +55,7 @@ func mutateProgRequest(fuzzer *Fuzzer, rnd *rand.Rand) *queue.Request { ) return &queue.Request{ Prog: newP, - ExecOpts: setFlags(ipc.FlagCollectSignal), + ExecOpts: setFlags(flatrpc.ExecFlagCollectSignal), Stat: fuzzer.statExecFuzz, } } @@ -69,7 +70,7 @@ func candidateRequest(fuzzer *Fuzzer, input Candidate) (*queue.Request, ProgType } return &queue.Request{ Prog: input.Prog, - ExecOpts: setFlags(ipc.FlagCollectSignal), + ExecOpts: setFlags(flatrpc.ExecFlagCollectSignal), Stat: fuzzer.statExecCandidate, Important: true, }, flags @@ -163,7 +164,7 @@ func (job *triageJob) deflake(exec func(*queue.Request, ProgTypes) *queue.Result } result := exec(&queue.Request{ Prog: job.p, - ExecOpts: setFlags(ipc.FlagCollectCover | ipc.FlagCollectSignal), + ExecOpts: setFlags(flatrpc.ExecFlagCollectCover | flatrpc.ExecFlagCollectSignal), ReturnAllSignal: true, Stat: stat, }, progInTriage) @@ -202,7 +203,7 @@ func (job *triageJob) minimize(newSignal signal.Signal) (stop bool) { for i := 0; i < minimizeAttempts; i++ { result := job.execute(&queue.Request{ Prog: p1, - ExecOpts: setFlags(ipc.FlagCollectSignal), + ExecOpts: setFlags(flatrpc.ExecFlagCollectSignal), SignalFilter: newSignal, SignalFilterCall: call1, Stat: job.fuzzer.statExecMinimize, @@ -273,7 +274,7 @@ func (job *smashJob) run(fuzzer *Fuzzer) { fuzzer.Config.Corpus.Programs()) result := fuzzer.execute(fuzzer.smashQueue, &queue.Request{ Prog: p, - ExecOpts: setFlags(ipc.FlagCollectSignal), + ExecOpts: setFlags(flatrpc.ExecFlagCollectSignal), Stat: fuzzer.statExecSmash, }) if result.Stop() { @@ -351,7 +352,7 @@ func (job *hintsJob) run(fuzzer *Fuzzer) { for i := 0; i < 2; i++ { result := fuzzer.execute(fuzzer.smashQueue, &queue.Request{ Prog: p, - ExecOpts: setFlags(ipc.FlagCollectComps), + ExecOpts: setFlags(flatrpc.ExecFlagCollectComps), Stat: fuzzer.statExecSeed, }) if result.Stop() || result.Info == nil { @@ -374,7 +375,7 @@ func (job *hintsJob) run(fuzzer *Fuzzer) { func(p *prog.Prog) bool { result := fuzzer.execute(fuzzer.smashQueue, &queue.Request{ Prog: p, - ExecOpts: setFlags(ipc.FlagCollectSignal), + ExecOpts: setFlags(flatrpc.ExecFlagCollectSignal), Stat: fuzzer.statExecHint, }) return !result.Stop() diff --git a/pkg/fuzzer/queue/queue.go b/pkg/fuzzer/queue/queue.go index 6ff94b9be..36226299a 100644 --- a/pkg/fuzzer/queue/queue.go +++ b/pkg/fuzzer/queue/queue.go @@ -11,6 +11,7 @@ import ( "sync" "sync/atomic" + "github.com/google/syzkaller/pkg/flatrpc" "github.com/google/syzkaller/pkg/hash" "github.com/google/syzkaller/pkg/ipc" "github.com/google/syzkaller/pkg/signal" @@ -102,15 +103,15 @@ func (r *Request) Risky() bool { } func (r *Request) Validate() error { - collectSignal := r.ExecOpts.ExecFlags&ipc.FlagCollectSignal > 0 + collectSignal := r.ExecOpts.ExecFlags&flatrpc.ExecFlagCollectSignal > 0 if r.ReturnAllSignal && !collectSignal { return fmt.Errorf("ReturnAllSignal is set, but FlagCollectSignal is not") } if r.SignalFilter != nil && !collectSignal { return fmt.Errorf("SignalFilter must be used with FlagCollectSignal") } - collectComps := r.ExecOpts.ExecFlags&ipc.FlagCollectComps > 0 - collectCover := r.ExecOpts.ExecFlags&ipc.FlagCollectCover > 0 + collectComps := r.ExecOpts.ExecFlags&flatrpc.ExecFlagCollectComps > 0 + collectCover := r.ExecOpts.ExecFlags&flatrpc.ExecFlagCollectCover > 0 if (collectComps) && (collectSignal || collectCover) { return fmt.Errorf("hint collection is mutually exclusive with signal/coverage") } -- cgit mrf-deployment