From b55e33926118ca417bb0ce0c76ceec7c220f65bc Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 18 Apr 2024 09:09:32 +0200 Subject: pkg/ipc: make it possible to change EnvFlags between executions Pass EnvFlags into Exec instead of New. This allows to change EnvFlags between executions. Change of EnvFlags forces executor process restart since it uses EnvFlags during setup. Currently this is intended to be NFC since we always pass the same EnvFlags. In future this will allow to (1) reduce part of the VM checking procedure to execution of programs with different options (e.g. we can probe for coverage/comparisons support, probe different sandboxes, etc); (2) use it during fuzzing/reproduction, e.g. we can check if the crash reproduces under setuid sandbox, or execute some fuzzing programs in significantly different modes. --- tools/syz-execprog/execprog.go | 40 ++++++++++++++++++++-------------------- tools/syz-stress/stress.go | 18 +++++++++--------- 2 files changed, 29 insertions(+), 29 deletions(-) (limited to 'tools') diff --git a/tools/syz-execprog/execprog.go b/tools/syz-execprog/execprog.go index 6bcc92a07..5d68dd2dd 100644 --- a/tools/syz-execprog/execprog.go +++ b/tools/syz-execprog/execprog.go @@ -185,7 +185,7 @@ func (ctx *Context) execute(pid int, env *ipc.Env, p *prog.Prog, progIndex int) for try := 0; ; try++ { output, info, hanged, err := env.ExecProg(callOpts, progData) if err != nil { - if ctx.config.Flags&ipc.FlagDebug != 0 { + if ctx.execOpts.EnvFlags&ipc.FlagDebug != 0 { log.Logf(0, "result: hanged=%v err=%v\n\n%s", hanged, err, output) } if try > 10 { @@ -361,52 +361,52 @@ func createConfig(target *prog.Target, features *host.Features, featuresFlags cs if err != nil { log.Fatalf("%v", err) } - if config.Flags&ipc.FlagSignal != 0 { - execOpts.Flags |= ipc.FlagCollectCover + if execOpts.EnvFlags&ipc.FlagSignal != 0 { + execOpts.ExecFlags |= ipc.FlagCollectCover } if *flagCoverFile != "" { - config.Flags |= ipc.FlagSignal - execOpts.Flags |= ipc.FlagCollectCover - execOpts.Flags &^= ipc.FlagDedupCover + execOpts.EnvFlags |= ipc.FlagSignal + execOpts.ExecFlags |= ipc.FlagCollectCover + execOpts.ExecFlags &^= ipc.FlagDedupCover } if *flagHints { - if execOpts.Flags&ipc.FlagCollectCover != 0 { - execOpts.Flags ^= ipc.FlagCollectCover + if execOpts.ExecFlags&ipc.FlagCollectCover != 0 { + execOpts.ExecFlags ^= ipc.FlagCollectCover } - execOpts.Flags |= ipc.FlagCollectComps + execOpts.ExecFlags |= ipc.FlagCollectComps } if features[host.FeatureExtraCoverage].Enabled { - config.Flags |= ipc.FlagExtraCover + execOpts.EnvFlags |= ipc.FlagExtraCover } if features[host.FeatureDelayKcovMmap].Enabled { - config.Flags |= ipc.FlagDelayKcovMmap + execOpts.EnvFlags |= ipc.FlagDelayKcovMmap } if featuresFlags["tun"].Enabled && features[host.FeatureNetInjection].Enabled { - config.Flags |= ipc.FlagEnableTun + execOpts.EnvFlags |= ipc.FlagEnableTun } if featuresFlags["net_dev"].Enabled && features[host.FeatureNetDevices].Enabled { - config.Flags |= ipc.FlagEnableNetDev + execOpts.EnvFlags |= ipc.FlagEnableNetDev } if featuresFlags["net_reset"].Enabled { - config.Flags |= ipc.FlagEnableNetReset + execOpts.EnvFlags |= ipc.FlagEnableNetReset } if featuresFlags["cgroups"].Enabled { - config.Flags |= ipc.FlagEnableCgroups + execOpts.EnvFlags |= ipc.FlagEnableCgroups } if featuresFlags["close_fds"].Enabled { - config.Flags |= ipc.FlagEnableCloseFds + execOpts.EnvFlags |= ipc.FlagEnableCloseFds } if featuresFlags["devlink_pci"].Enabled && features[host.FeatureDevlinkPCI].Enabled { - config.Flags |= ipc.FlagEnableDevlinkPCI + execOpts.EnvFlags |= ipc.FlagEnableDevlinkPCI } if featuresFlags["nic_vf"].Enabled && features[host.FeatureNicVF].Enabled { - config.Flags |= ipc.FlagEnableNicVF + execOpts.EnvFlags |= ipc.FlagEnableNicVF } if featuresFlags["vhci"].Enabled && features[host.FeatureVhciInjection].Enabled { - config.Flags |= ipc.FlagEnableVhciInjection + execOpts.EnvFlags |= ipc.FlagEnableVhciInjection } if featuresFlags["wifi"].Enabled && features[host.FeatureWifiEmulation].Enabled { - config.Flags |= ipc.FlagEnableWifi + execOpts.EnvFlags |= ipc.FlagEnableWifi } return config, execOpts } diff --git a/tools/syz-stress/stress.go b/tools/syz-stress/stress.go index 853021afb..8396148e2 100644 --- a/tools/syz-stress/stress.go +++ b/tools/syz-stress/stress.go @@ -151,31 +151,31 @@ func createIPCConfig(target *prog.Target, features *host.Features, featuresFlags return nil, nil, err } if featuresFlags["tun"].Enabled && features[host.FeatureNetInjection].Enabled { - config.Flags |= ipc.FlagEnableTun + execOpts.EnvFlags |= ipc.FlagEnableTun } if featuresFlags["net_dev"].Enabled && features[host.FeatureNetDevices].Enabled { - config.Flags |= ipc.FlagEnableNetDev + execOpts.EnvFlags |= ipc.FlagEnableNetDev } if featuresFlags["net_reset"].Enabled { - config.Flags |= ipc.FlagEnableNetReset + execOpts.EnvFlags |= ipc.FlagEnableNetReset } if featuresFlags["cgroups"].Enabled { - config.Flags |= ipc.FlagEnableCgroups + execOpts.EnvFlags |= ipc.FlagEnableCgroups } if featuresFlags["close_fds"].Enabled { - config.Flags |= ipc.FlagEnableCloseFds + execOpts.EnvFlags |= ipc.FlagEnableCloseFds } if featuresFlags["devlink_pci"].Enabled && features[host.FeatureDevlinkPCI].Enabled { - config.Flags |= ipc.FlagEnableDevlinkPCI + execOpts.EnvFlags |= ipc.FlagEnableDevlinkPCI } if featuresFlags["nic_vf"].Enabled && features[host.FeatureNicVF].Enabled { - config.Flags |= ipc.FlagEnableNicVF + execOpts.EnvFlags |= ipc.FlagEnableNicVF } if featuresFlags["vhci"].Enabled && features[host.FeatureVhciInjection].Enabled { - config.Flags |= ipc.FlagEnableVhciInjection + execOpts.EnvFlags |= ipc.FlagEnableVhciInjection } if featuresFlags["wifi"].Enabled && features[host.FeatureWifiEmulation].Enabled { - config.Flags |= ipc.FlagEnableWifi + execOpts.EnvFlags |= ipc.FlagEnableWifi } return config, execOpts, nil } -- cgit mrf-deployment