aboutsummaryrefslogtreecommitdiffstats
path: root/tools/syz-db
diff options
context:
space:
mode:
Diffstat (limited to 'tools/syz-db')
-rw-r--r--tools/syz-db/syz-db.go34
-rw-r--r--tools/syz-db/syz-db_test.go52
2 files changed, 86 insertions, 0 deletions
diff --git a/tools/syz-db/syz-db.go b/tools/syz-db/syz-db.go
index 5baa6010b..3cec95097 100644
--- a/tools/syz-db/syz-db.go
+++ b/tools/syz-db/syz-db.go
@@ -74,6 +74,11 @@ func main() {
usage()
}
print(args[1])
+ case "rm":
+ if len(args) != 3 {
+ usage()
+ }
+ rm(args[1], args[2], target)
default:
usage()
}
@@ -99,6 +104,8 @@ offered:
syz-db bench corpus.db
print corpus db:
syz-db print corpus.db
+ remove a syscall from db
+ syz-db rm corpus.db syscall_name
`)
os.Exit(1)
}
@@ -242,3 +249,30 @@ func print(file string) {
fmt.Printf("%v\n%v\n", key, string(rec.Val))
}
}
+
+func rm(file, syscall string, target *prog.Target) {
+ db, err := db.Open(file, false)
+ if err != nil {
+ tool.Failf("failed to open database: %w", err)
+ }
+ for key, rec := range db.Records {
+ p, err := target.Deserialize(rec.Val, prog.NonStrict)
+ if err != nil {
+ tool.Failf("failed to deserialize: %w\n%s", err, rec.Val)
+ }
+ for i := len(p.Calls) - 1; i >= 0; i-- {
+ if strings.Contains(p.Calls[i].Meta.Name, syscall) {
+ p.RemoveCall(i)
+ }
+ }
+ data := p.Serialize()
+ if len(data) > 0 {
+ db.Save(key, data, rec.Seq)
+ } else {
+ delete(db.Records, key)
+ }
+ }
+ if err := db.Flush(); err != nil {
+ tool.Fail(err)
+ }
+}
diff --git a/tools/syz-db/syz-db_test.go b/tools/syz-db/syz-db_test.go
new file mode 100644
index 000000000..56aa055c6
--- /dev/null
+++ b/tools/syz-db/syz-db_test.go
@@ -0,0 +1,52 @@
+// Copyright (c) Qualcomm Innovation Center, Inc. All rights reserved
+// Copyright 2024 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.
+
+package main
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/google/syzkaller/pkg/db"
+ "github.com/google/syzkaller/pkg/osutil"
+ "github.com/google/syzkaller/prog"
+ "github.com/google/syzkaller/sys/targets"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestDBRemoveMatchLine(t *testing.T) {
+ fn, err := osutil.TempFile("syzkaller.test.db")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.Remove(fn)
+ db1, err := db.Open(fn, false)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ input := []string{
+ "r0 = open$dir(&(0x7f0000000000), 0x161840, 0x162)",
+ "ioctl$BTRFS_IOC_DEFRAG(r0, 0x50009402, 0x0)",
+ "close(r0)",
+ }
+ want := []string{
+ "ioctl$BTRFS_IOC_DEFRAG(0xffffffffffffffff, 0x50009402, 0x0)",
+ "close(0xffffffffffffffff)",
+ }
+ db1.Save("rm", []byte(strings.Join(input, "\n")), 0)
+ db1.Flush()
+ target, err := prog.GetTarget(targets.Linux, targets.AMD64)
+ if err != nil {
+ t.Fatal(err)
+ }
+ rm(fn, "open$dir", target)
+ db1, err = db.Open(fn, false)
+ if err != nil {
+ t.Fatalf("failed to open db: %v", err)
+ }
+ expected := fmt.Sprintf("%s\n", strings.Join(want, "\n"))
+ assert.Equal(t, expected, string(db1.Records["rm"].Val))
+}