diff options
Diffstat (limited to 'tools/syz-db')
| -rw-r--r-- | tools/syz-db/syz-db.go | 34 | ||||
| -rw-r--r-- | tools/syz-db/syz-db_test.go | 52 |
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)) +} |
