From f6d6eaf3a6a0e2269572ee2e3fbdc4eb91e54c4d Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 15 Oct 2020 16:01:00 +0200 Subject: 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 --- tools/syz-minconfig/minconfig.go | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tools/syz-minconfig/minconfig.go 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) +} -- cgit mrf-deployment