aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-12-06 16:49:37 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-12-06 16:49:37 +0100
commitc1641491e47613ad780871c3c996fe8025b97708 (patch)
treefc7037a9a2c9af9cb647c05fd3d5ca835463ebe4
parentd68400a8d17b612757bb456754601b8975a18e06 (diff)
pkg/db: provide helper function for database creation
This is needed for both tools/syz-db and tools/syz-trace2syz. Also, remove code to resolve SHA1 collisions. Also, don't set db version as we actually want to minimize and smash these programs like anything else (not minimizing nor smashing them is only useful during tool testing).
-rw-r--r--pkg/db/db.go20
-rw-r--r--tools/syz-db/syz-db.go18
-rw-r--r--tools/syz-trace2syz/trace2syz.go30
3 files changed, 34 insertions, 34 deletions
diff --git a/pkg/db/db.go b/pkg/db/db.go
index 5c2755860..fde371d90 100644
--- a/pkg/db/db.go
+++ b/pkg/db/db.go
@@ -18,6 +18,7 @@ import (
"io/ioutil"
"os"
+ "github.com/google/syzkaller/pkg/hash"
"github.com/google/syzkaller/pkg/log"
"github.com/google/syzkaller/pkg/osutil"
)
@@ -263,3 +264,22 @@ func deserializeRecord(r *bufio.Reader) (key string, val []byte, seq uint64, err
}
return
}
+
+// Create creates a new database in the specified file with the specified records.
+func Create(filename string, version uint64, records []Record) error {
+ os.Remove(filename)
+ db, err := Open(filename)
+ if err != nil {
+ return fmt.Errorf("failed to open database file: %v", err)
+ }
+ if err := db.BumpVersion(version); err != nil {
+ return fmt.Errorf("failed to bump database version: %v", err)
+ }
+ for _, rec := range records {
+ db.Save(hash.String(rec.Val), rec.Val, rec.Seq)
+ }
+ if err := db.Flush(); err != nil {
+ return fmt.Errorf("failed to save database file: %v", err)
+ }
+ return nil
+}
diff --git a/tools/syz-db/syz-db.go b/tools/syz-db/syz-db.go
index ecf85495c..6aa96a0c0 100644
--- a/tools/syz-db/syz-db.go
+++ b/tools/syz-db/syz-db.go
@@ -60,14 +60,7 @@ func pack(dir, file string, target *prog.Target, version uint64) {
if err != nil {
failf("failed to read dir: %v", err)
}
- os.Remove(file)
- db, err := db.Open(file)
- if err != nil {
- failf("failed to open database file: %v", err)
- }
- if err := db.BumpVersion(version); err != nil {
- failf("failed to bump database version: %v", err)
- }
+ var records []db.Record
for _, file := range files {
data, err := ioutil.ReadFile(filepath.Join(dir, file.Name()))
if err != nil {
@@ -93,10 +86,13 @@ func pack(dir, file string, target *prog.Target, version uint64) {
fmt.Fprintf(os.Stderr, "fixing hash %v -> %v\n", key, sig)
key = sig
}
- db.Save(key, data, seq)
+ records = append(records, db.Record{
+ Val: data,
+ Seq: seq,
+ })
}
- if err := db.Flush(); err != nil {
- failf("failed to save database file: %v", err)
+ if err := db.Create(file, version, records); err != nil {
+ failf("%v", err)
}
}
diff --git a/tools/syz-trace2syz/trace2syz.go b/tools/syz-trace2syz/trace2syz.go
index 600171bd9..0a785e629 100644
--- a/tools/syz-trace2syz/trace2syz.go
+++ b/tools/syz-trace2syz/trace2syz.go
@@ -11,14 +11,11 @@ package main
import (
"flag"
- "fmt"
"io/ioutil"
- "os"
"path/filepath"
"strconv"
"github.com/google/syzkaller/pkg/db"
- "github.com/google/syzkaller/pkg/hash"
"github.com/google/syzkaller/pkg/log"
"github.com/google/syzkaller/prog"
_ "github.com/google/syzkaller/sys"
@@ -34,9 +31,8 @@ var (
)
const (
- goos = "linux" // Target OS
- arch = "amd64" // Target architecture
- currentDBVersion = 3 // Marked as minimized
+ goos = "linux" // Target OS
+ arch = "amd64" // Target architecture
)
func main() {
@@ -150,24 +146,12 @@ func parseTree(tree *parser.TraceTree, pid int64, target *prog.Target) []*progge
}
func pack(progs []*prog.Prog) {
- corpusDb := "corpus.db"
- os.Remove(corpusDb)
- syzDb, err := db.Open(corpusDb)
-
- if err != nil {
- log.Fatalf("failed to open database file: %v", err)
- }
- syzDb.BumpVersion(currentDBVersion)
- for i, prog := range progs {
- data := prog.Serialize()
- key := hash.String(data)
- if _, ok := syzDb.Records[key]; ok {
- key += fmt.Sprint(i)
- }
- syzDb.Save(key, data, 0)
+ var records []db.Record
+ for _, prog := range progs {
+ records = append(records, db.Record{Val: prog.Serialize()})
}
- if err := syzDb.Flush(); err != nil {
- log.Fatalf("failed to save database file: %v", err)
+ if err := db.Create("corpus.db", 0, records); err != nil {
+ log.Fatalf("%v", err)
}
log.Logf(0, "finished!")
}