aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/db/db.go13
-rw-r--r--pkg/db/db_test.go20
-rw-r--r--syz-hub/state/state.go4
-rw-r--r--syz-manager/manager.go2
-rw-r--r--tools/syz-db/syz-db.go4
-rw-r--r--tools/syz-execprog/execprog.go2
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 {