diff options
| -rw-r--r-- | pkg/db/db.go | 13 | ||||
| -rw-r--r-- | pkg/db/db_test.go | 20 | ||||
| -rw-r--r-- | syz-hub/state/state.go | 4 | ||||
| -rw-r--r-- | syz-manager/manager.go | 2 | ||||
| -rw-r--r-- | tools/syz-db/syz-db.go | 4 | ||||
| -rw-r--r-- | tools/syz-execprog/execprog.go | 2 |
6 files changed, 24 insertions, 21 deletions
diff --git a/pkg/db/db.go b/pkg/db/db.go index c2082c0a2..ae0c374e9 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -40,7 +40,7 @@ type Record struct { // Open opens the specified database file. // If the database is corrupted and reading failed, then it returns an non-nil db // with whatever records were recovered and a non-nil error at the same time. -func Open(filename string) (*DB, error) { +func Open(filename string, repair bool) (*DB, error) { db := &DB{ filename: filename, } @@ -49,10 +49,13 @@ func Open(filename string) (*DB, error) { return nil, err } defer f.Close() - // Deserialization error is considered a "soft" error, - // but compact below ensures that the file is at least writable. var deserializeErr error db.Version, db.Records, db.uncompacted, deserializeErr = deserializeDB(bufio.NewReader(f)) + // Deserialization error is considered a "soft" error if repair == true, + // but compact below ensures that the file is at least writable. + if deserializeErr != nil && !repair { + return nil, deserializeErr + } f.Close() // compact will rewrite the file, so close our descriptor if err := db.compact(); err != nil { return nil, err @@ -273,7 +276,7 @@ func deserializeRecord(r *bufio.Reader) (key string, val []byte, seq uint64, err // 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) + db, err := Open(filename, true) if err != nil { return fmt.Errorf("failed to open database file: %v", err) } @@ -293,7 +296,7 @@ func ReadCorpus(filename string, target *prog.Target) (progs []*prog.Prog, err e if filename == "" { return } - db, err := Open(filename) + db, err := Open(filename, false) if err != nil { return nil, fmt.Errorf("failed to open database file: %v", err) } diff --git a/pkg/db/db_test.go b/pkg/db/db_test.go index 9d10ffbed..f6917ef17 100644 --- a/pkg/db/db_test.go +++ b/pkg/db/db_test.go @@ -17,7 +17,7 @@ import ( func TestBasic(t *testing.T) { fn := tempFile(t) defer os.Remove(fn) - db, err := Open(fn) + db, err := Open(fn, false) if err != nil { t.Fatalf("failed to open db: %v", err) } @@ -42,7 +42,7 @@ func TestBasic(t *testing.T) { if !reflect.DeepEqual(db.Records, want) { t.Fatalf("bad db after flush: %v, want: %v", db.Records, want) } - db, err = Open(fn) + db, err = Open(fn, false) if err != nil { t.Fatalf("failed to open db: %v", err) } @@ -54,7 +54,7 @@ func TestBasic(t *testing.T) { func TestModify(t *testing.T) { fn := tempFile(t) defer os.Remove(fn) - db, err := Open(fn) + db, err := Open(fn, false) if err != nil { t.Fatalf("failed to open db: %v", err) } @@ -83,7 +83,7 @@ func TestModify(t *testing.T) { if !reflect.DeepEqual(db.Records, want) { t.Fatalf("bad db after flush: %v, want: %v", db.Records, want) } - db, err = Open(fn) + db, err = Open(fn, false) if err != nil { t.Fatalf("failed to open db: %v", err) } @@ -95,7 +95,7 @@ func TestModify(t *testing.T) { func TestLarge(t *testing.T) { fn := tempFile(t) defer os.Remove(fn) - db, err := Open(fn) + db, err := Open(fn, false) if err != nil { t.Fatalf("failed to open db: %v", err) } @@ -110,7 +110,7 @@ func TestLarge(t *testing.T) { if err := db.Flush(); err != nil { t.Fatalf("failed to flush db: %v", err) } - db, err = Open(fn) + db, err = Open(fn, false) if err != nil { t.Fatalf("failed to open db: %v", err) } @@ -130,7 +130,7 @@ func TestOpenInvalid(t *testing.T) { if _, err := f.Write([]byte(`some invalid data`)); err != nil { t.Error(err) } - if db, err := Open(f.Name()); err == nil { + if db, err := Open(f.Name(), true); err == nil { t.Fatal("opened invalid db") } else if db == nil { t.Fatal("db is nil") @@ -149,7 +149,7 @@ func TestOpenInaccessible(t *testing.T) { os.Chmod(f.Name(), 0) defer os.Chmod(f.Name(), 0777) defer os.Remove(f.Name()) - if db, err := Open(f.Name()); err == nil { + if db, err := Open(f.Name(), false); err == nil { t.Fatal("opened inaccessible db") } else if db != nil { t.Fatal("db is not nil") @@ -159,7 +159,7 @@ func TestOpenInaccessible(t *testing.T) { func TestOpenCorrupted(t *testing.T) { fn := tempFile(t) defer os.Remove(fn) - db, err := Open(fn) + db, err := Open(fn, false) if err != nil { t.Fatalf("failed to open db: %v", err) } @@ -181,7 +181,7 @@ func TestOpenCorrupted(t *testing.T) { if err := osutil.WriteFile(fn, data); err != nil { t.Fatalf("failed to write db: %v", err) } - db, err = Open(fn) + db, err = Open(fn, true) if err == nil { t.Fatalf("no error for corrutped db") } diff --git a/syz-hub/state/state.go b/syz-hub/state/state.go index 44b416d6d..1c7105003 100644 --- a/syz-hub/state/state.go +++ b/syz-hub/state/state.go @@ -102,7 +102,7 @@ func (st *State) Flush() { func loadDB(file, name string, progs bool) (*db.DB, uint64, error) { log.Logf(0, "reading %v...", name) - db, err := db.Open(file) + db, err := db.Open(file, true) if err != nil { return nil, 0, fmt.Errorf("failed to open %v database: %v", name, err) } @@ -198,7 +198,7 @@ func (st *State) Connect(name, domain string, fresh bool, calls []string, corpus os.Remove(mgr.corpusFile) var err error - mgr.Corpus, err = db.Open(mgr.corpusFile) + mgr.Corpus, err = db.Open(mgr.corpusFile, true) if err != nil { log.Logf(0, "failed to open corpus database: %v", err) return err diff --git a/syz-manager/manager.go b/syz-manager/manager.go index 6382797a2..403ac71cb 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -444,7 +444,7 @@ func (mgr *Manager) vmLoop() { func (mgr *Manager) preloadCorpus() { log.Logf(0, "loading corpus...") - corpusDB, err := db.Open(filepath.Join(mgr.cfg.Workdir, "corpus.db")) + corpusDB, err := db.Open(filepath.Join(mgr.cfg.Workdir, "corpus.db"), true) if err != nil { if corpusDB == nil { log.Fatalf("failed to open corpus database: %v", err) diff --git a/tools/syz-db/syz-db.go b/tools/syz-db/syz-db.go index 0b48e7c6d..20255c9db 100644 --- a/tools/syz-db/syz-db.go +++ b/tools/syz-db/syz-db.go @@ -115,7 +115,7 @@ func pack(dir, file string, target *prog.Target, version uint64) { } func unpack(file, dir string) { - db, err := db.Open(file) + db, err := db.Open(file, false) if err != nil { tool.Failf("failed to open database: %v", err) } @@ -133,7 +133,7 @@ func unpack(file, dir string) { func bench(target *prog.Target, file string) { start := time.Now() - db, err := db.Open(file) + db, err := db.Open(file, false) if err != nil { tool.Failf("failed to open database: %v", err) } diff --git a/tools/syz-execprog/execprog.go b/tools/syz-execprog/execprog.go index d22b5a0bf..86667f854 100644 --- a/tools/syz-execprog/execprog.go +++ b/tools/syz-execprog/execprog.go @@ -289,7 +289,7 @@ func (ctx *Context) getProgramIndex() int { func loadPrograms(target *prog.Target, files []string) []*prog.Prog { var progs []*prog.Prog for _, fn := range files { - if corpus, err := db.Open(fn); err == nil { + if corpus, err := db.Open(fn, false); err == nil { for _, rec := range corpus.Records { p, err := target.Deserialize(rec.Val, prog.NonStrict) if err != nil { |
