diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-10-15 16:01:00 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-10-21 10:22:10 +0200 |
| commit | f6d6eaf3a6a0e2269572ee2e3fbdc4eb91e54c4d (patch) | |
| tree | fbdcdb28430f9a422f569bf58f5ed9488bfe569c | |
| parent | c302c1e1882be5d269878222eed1f14edce54c6c (diff) | |
tools/syz-minconfig: add tool
syz-minconfig is a tool for manual checking of config minimization functionality in pkg/kconfig/minimize.go.
Example use:
$ go run tools/syz-minconfig/minconfig.go -sourcedir /src/linux -configs CAIF_NETDEV,CAIF_USB \
-base dashboard/config/linux/upstream-kasan-base.config \
-full dashboard/config/linux/upstream-kasan.config \
Update #2171
| -rw-r--r-- | tools/syz-minconfig/minconfig.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tools/syz-minconfig/minconfig.go b/tools/syz-minconfig/minconfig.go new file mode 100644 index 000000000..b68c183eb --- /dev/null +++ b/tools/syz-minconfig/minconfig.go @@ -0,0 +1,59 @@ +// Copyright 2020 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +// syz-minconfig is a tool for manual checking of config minimization functionality in pkg/kconfig/minimize.go. +// Example use: +// $ go run tools/syz-minconfig/minconfig.go -sourcedir /src/linux -configs CAIF_NETDEV,CAIF_USB \ +// -base dashboard/config/linux/upstream-kasan-base.config \ +// -full dashboard/config/linux/upstream-kasan.config \ +package main + +import ( + "flag" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/google/syzkaller/pkg/kconfig" +) + +func main() { + var ( + flagSourceDir = flag.String("sourcedir", "", "kernel sources dir") + flagBase = flag.String("base", "", "baseline config") + flagFull = flag.String("full", "", "full config") + flagConfigs = flag.String("configs", "", "comma-separated list of configs for the crash predicate") + ) + flag.Parse() + kconf, err := kconfig.Parse(filepath.Join(*flagSourceDir, "Kconfig")) + if err != nil { + failf("%v", err) + } + base, err := kconfig.ParseConfig(*flagBase) + if err != nil { + failf("%v", err) + } + full, err := kconfig.ParseConfig(*flagFull) + if err != nil { + failf("%v", err) + } + pred := func(candidate *kconfig.ConfigFile) (bool, error) { + for _, cfg := range strings.Split(*flagConfigs, ",") { + if candidate.Value(cfg) == kconfig.No { + return false, nil + } + } + return true, nil + } + res, err := kconf.Minimize(base, full, pred, os.Stderr) + if err != nil { + failf("%v", err) + } + os.Stdout.Write(res.Serialize()) +} + +func failf(msg string, args ...interface{}) { + fmt.Fprintf(os.Stderr, msg+"\n", args...) + os.Exit(1) +} |
