aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/bisect
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/bisect')
-rw-r--r--pkg/bisect/bisect.go41
-rw-r--r--pkg/bisect/bisect_test.go18
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.
{