aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/subsystem/entities.go22
-rw-r--r--pkg/subsystem/entities_test.go15
-rw-r--r--tools/syz-query-subsystems/query_subsystems.go30
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)