diff options
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. { |
