diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-07-01 22:51:28 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-07-02 10:56:05 +0200 |
| commit | f30c14bfec4b49e528a756b28cc010925e2f286b (patch) | |
| tree | 4a9a565f0719db6450e0832cfb09ec6b50254548 /pkg/bisect | |
| parent | 39ffeee9d8f9f2d27899311d06591a7ffaba3b26 (diff) | |
pkg/bisect: fix noop change detection with config minimization
Config minimization did not update test results for the starting commit.
Test result for the starting commit still refered to the original config,
not the minimized config that was actually used during bisection.
Diffstat (limited to 'pkg/bisect')
| -rw-r--r-- | pkg/bisect/bisect.go | 41 | ||||
| -rw-r--r-- | pkg/bisect/bisect_test.go | 18 |
2 files changed, 39 insertions, 20 deletions
diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index 6cbf5afe5..cbe0fe27f 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -210,9 +210,13 @@ func (env *env) bisect() (*Result, error) { } if len(cfg.Kernel.BaselineConfig) != 0 { - if err := env.minimizeConfig(); err != nil { + testRes1, err := env.minimizeConfig() + if err != nil { return nil, err } + if testRes1 != nil { + testRes = testRes1 + } } bad, good, rep1, results1, err := env.commitRange() @@ -277,7 +281,7 @@ func (env *env) bisect() (*Result, error) { return res, nil } -func (env *env) minimizeConfig() error { +func (env *env) minimizeConfig() (*testResult, error) { cfg := env.cfg // Check if crash reproduces with baseline config. env.kernelConfig = cfg.Kernel.BaselineConfig @@ -285,16 +289,16 @@ func (env *env) minimizeConfig() error { if err != nil { env.log("testing baseline config failed: %v", err) env.kernelConfig = cfg.Kernel.Config - return err + return nil, err } if testRes.verdict == vcs.BisectBad { env.log("crash reproduces with baseline config") - return nil + return testRes, nil } if testRes.verdict == vcs.BisectSkip { env.log("unable to test using baseline config, keep original config") env.kernelConfig = cfg.Kernel.Config - return nil + return nil, nil } predMinimize := func(test []byte) (vcs.BisectResult, error) { env.kernelConfig = test @@ -309,21 +313,22 @@ func (env *env) minimizeConfig() error { cfg.Kernel.BaselineConfig, cfg.Trace, predMinimize) if err != nil { env.log("minimizing config failed: %v", err) - return err + return nil, err } - if !bytes.Equal(env.kernelConfig, cfg.Kernel.Config) { - // Check that crash is really reproduced with generated config. - testRes, err = env.test() - if err != nil { - return fmt.Errorf("testing generated minimized config failed: %v", err) - } - if testRes.verdict != vcs.BisectBad { - env.log("testing with generated minimized config doesn't reproduce the crash") - env.kernelConfig = cfg.Kernel.Config - return nil - } + if bytes.Equal(env.kernelConfig, cfg.Kernel.Config) { + return nil, nil } - return nil + // Check that crash is really reproduced with generated config. + testRes, err = env.test() + if err != nil { + return nil, fmt.Errorf("testing generated minimized config failed: %v", err) + } + if testRes.verdict != vcs.BisectBad { + env.log("testing with generated minimized config doesn't reproduce the crash") + env.kernelConfig = cfg.Kernel.Config + return nil, nil + } + return testRes, nil } func (env *env) detectNoopChange(results map[string]*testResult, com *vcs.Commit) (bool, error) { diff --git a/pkg/bisect/bisect_test.go b/pkg/bisect/bisect_test.go index 6815c1ab8..a7462a3b1 100644 --- a/pkg/bisect/bisect_test.go +++ b/pkg/bisect/bisect_test.go @@ -11,6 +11,7 @@ import ( "strconv" "testing" + "github.com/google/syzkaller/pkg/hash" "github.com/google/syzkaller/pkg/instance" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/pkg/report" @@ -34,9 +35,10 @@ func (env *testEnv) BuildSyzkaller(repo, commit string) error { func (env *testEnv) BuildKernel(compilerBin, userspaceDir, cmdlineFile, sysctlFile string, kernelConfig []byte) (string, string, error) { commit := env.headCommit() - kernelSign := fmt.Sprintf("sign-%v", commit) + configHash := hash.String(kernelConfig) + kernelSign := fmt.Sprintf("%v-%v", commit, configHash) if commit >= env.test.sameBinaryStart && commit <= env.test.sameBinaryEnd { - kernelSign = "same-sign" + kernelSign = "same-sign-" + configHash } env.config = string(kernelConfig) if env.config == "baseline-fails" || env.config == "broken-build" { @@ -233,6 +235,18 @@ var bisectionTests = []BisectionTest{ baselineConfig: "minimize-fails", expectErr: true, }, + { + name: "config-minimize-same-hash", + startCommit: 905, + commitLen: 1, + expectRep: true, + culprit: 905, + sameBinaryStart: 904, + sameBinaryEnd: 905, + noopChange: true, + baselineConfig: "minimize-succeeds", + resultingConfig: "new-minimized-config", + }, // Tests that cause bisection returns error when crash does not reproduce // on the original commit. { |
