aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-07-01 22:51:28 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-07-02 10:56:05 +0200
commitf30c14bfec4b49e528a756b28cc010925e2f286b (patch)
tree4a9a565f0719db6450e0832cfb09ec6b50254548 /pkg
parent39ffeee9d8f9f2d27899311d06591a7ffaba3b26 (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')
-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.
{