diff options
| -rw-r--r-- | pkg/subsystem/entities.go | 22 | ||||
| -rw-r--r-- | pkg/subsystem/entities_test.go | 15 | ||||
| -rw-r--r-- | tools/syz-query-subsystems/query_subsystems.go | 30 |
3 files changed, 67 insertions, 0 deletions
diff --git a/pkg/subsystem/entities.go b/pkg/subsystem/entities.go index 1f7456e84..457e57a3e 100644 --- a/pkg/subsystem/entities.go +++ b/pkg/subsystem/entities.go @@ -44,6 +44,28 @@ func (subsystem *Subsystem) Emails() []string { return ret } +func FilterList(list []*Subsystem, filter func(*Subsystem) bool) []*Subsystem { + keep := map[*Subsystem]bool{} + for _, item := range list { + keep[item] = filter(item) + } + newList := []*Subsystem{} + for _, item := range list { + if !keep[item] { + continue + } + newParents := []*Subsystem{} + for _, p := range item.Parents { + if keep[p] { + newParents = append(newParents, p) + } + } + item.Parents = newParents + newList = append(newList, item) + } + return newList +} + // PathRule describes the part of the directory tree belonging to a single subsystem. type PathRule struct { IncludeRegexp string diff --git a/pkg/subsystem/entities_test.go b/pkg/subsystem/entities_test.go index 58166b91b..81c970b65 100644 --- a/pkg/subsystem/entities_test.go +++ b/pkg/subsystem/entities_test.go @@ -39,3 +39,18 @@ func TestSubsystemEmails(t *testing.T) { "a@list.com", "b@list.com", "c@list.com", "d@list.com", "d@person.com", }) } + +func TestFilterList(t *testing.T) { + parentParent := &Subsystem{} + parentA := &Subsystem{Parents: []*Subsystem{parentParent}} + parentB := &Subsystem{Parents: []*Subsystem{parentParent}} + entity := &Subsystem{Parents: []*Subsystem{parentA, parentB}} + + newList := FilterList([]*Subsystem{parentA, parentB, parentParent, entity}, + func(s *Subsystem) bool { + return s != parentB + }, + ) + assert.Len(t, newList, 3) + assert.ElementsMatch(t, entity.Parents, []*Subsystem{parentA}) +} diff --git a/tools/syz-query-subsystems/query_subsystems.go b/tools/syz-query-subsystems/query_subsystems.go index 54ef93d35..29fa9e81a 100644 --- a/tools/syz-query-subsystems/query_subsystems.go +++ b/tools/syz-query-subsystems/query_subsystems.go @@ -15,6 +15,7 @@ import ( "strings" "github.com/google/syzkaller/pkg/osutil" + "github.com/google/syzkaller/pkg/subsystem" "github.com/google/syzkaller/pkg/subsystem/linux" "github.com/google/syzkaller/pkg/tool" "github.com/google/syzkaller/pkg/vcs" @@ -25,6 +26,8 @@ var ( flagKernelRepo = flag.String("kernel", "", "path to the OS kernel source directory") flagSyzkallerRepo = flag.String("syzkaller", "", "path to the syzkaller repo") flagName = flag.String("name", "", "the name under which the list should be saved") + flagFilter = flag.String("filter", "", "comma-separated list of subsystems to keep") + flagEmails = flag.Bool("emails", true, "save lists and maintainer fields") ) var nameRe = regexp.MustCompile(`^[a-z]\w*$`) @@ -49,6 +52,7 @@ func main() { if err != nil { tool.Failf("failed to query subsystems: %v", err) } + list = postProcessList(list) // Save the list. folder := filepath.Join(*flagSyzkallerRepo, "pkg", "subsystem", "lists") if err = osutil.MkdirAll(folder); err != nil { @@ -65,6 +69,32 @@ func main() { } } +func postProcessList(list []*subsystem.Subsystem) []*subsystem.Subsystem { + if *flagFilter != "" { + list = subsystem.FilterList(list, prepareFilter()) + } + if !*flagEmails { + for _, item := range list { + item.Lists = nil + item.Maintainers = nil + } + } + return list +} + +func prepareFilter() func(*subsystem.Subsystem) bool { + keep := map[string]bool{} + for _, name := range strings.Split(*flagFilter, ",") { + name = strings.TrimSpace(name) + if name != "" { + keep[name] = true + } + } + return func(s *subsystem.Subsystem) bool { + return keep[s.Name] + } +} + func determineCommitInfo(dir string) string { // Best effort only. repo, err := vcs.NewRepo(*flagOS, "", dir, vcs.OptPrecious, vcs.OptDontSandbox) |
