aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-10-15 16:01:00 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-10-21 10:22:10 +0200
commitf6d6eaf3a6a0e2269572ee2e3fbdc4eb91e54c4d (patch)
treefbdcdb28430f9a422f569bf58f5ed9488bfe569c
parentc302c1e1882be5d269878222eed1f14edce54c6c (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.go59
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)
+}