diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2021-12-09 09:01:32 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2021-12-09 13:56:10 +0100 |
| commit | a254b0f5219f1bc666975348b583795a324085cb (patch) | |
| tree | e9f58ad20bb1eb887216b762457eb75ce0905db8 /pkg | |
| parent | a4a2a50158b25d4af0fd07528f38e6656b903d68 (diff) | |
pkg/db: properly handle errors when loading a DB
Properly return errors to caller instead of logging them.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/db/db.go | 15 | ||||
| -rw-r--r-- | pkg/db/db_test.go | 17 |
2 files changed, 26 insertions, 6 deletions
diff --git a/pkg/db/db.go b/pkg/db/db.go index 17723b224..b62882b60 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -19,7 +19,6 @@ import ( "os" "github.com/google/syzkaller/pkg/hash" - "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/pkg/osutil" "github.com/google/syzkaller/prog" ) @@ -46,9 +45,13 @@ func Open(filename string) (*DB, error) { if err != nil { return nil, err } - db.Version, db.Records, db.uncompacted = deserializeDB(bufio.NewReader(f)) - f.Close() + defer f.Close() + db.Version, db.Records, db.uncompacted, err = deserializeDB(bufio.NewReader(f)) + if err != nil { + return nil, err + } if len(db.Records) == 0 || db.uncompacted/10*9 > len(db.Records) { + f.Close() // compact will rewrite the file, so close our descriptor if err := db.compact(); err != nil { return nil, err } @@ -176,11 +179,11 @@ func serializeRecord(w *bytes.Buffer, key string, val []byte, seq uint64) { } } -func deserializeDB(r *bufio.Reader) (version uint64, records map[string]Record, uncompacted int) { +func deserializeDB(r *bufio.Reader) (version uint64, records map[string]Record, uncompacted int, err0 error) { records = make(map[string]Record) ver, err := deserializeHeader(r) if err != nil { - log.Logf(0, "failed to deserialize database header: %v", err) + err0 = fmt.Errorf("failed to deserialize database header: %v", err) return } version = ver @@ -190,7 +193,7 @@ func deserializeDB(r *bufio.Reader) (version uint64, records map[string]Record, return } if err != nil { - log.Logf(0, "failed to deserialize database record: %v", err) + err0 = fmt.Errorf("failed to deserialize database record: %v", err) return } uncompacted++ diff --git a/pkg/db/db_test.go b/pkg/db/db_test.go index 38456eb17..71b93fd64 100644 --- a/pkg/db/db_test.go +++ b/pkg/db/db_test.go @@ -5,6 +5,7 @@ package db import ( "fmt" + "io/ioutil" "math/rand" "os" "reflect" @@ -118,6 +119,22 @@ func TestLarge(t *testing.T) { } } +func TestOpenInvalid(t *testing.T) { + f, err := ioutil.TempFile("", "syz-db-test") + if err != nil { + t.Error(err) + } + + defer f.Close() + defer os.Remove(f.Name()) + if _, err := f.Write([]byte(`some invalid data`)); err != nil { + t.Error(err) + } + if _, err := Open(f.Name()); err == nil { + t.Fatal("opened invalid db") + } +} + func tempFile(t *testing.T) string { fn, err := osutil.TempFile("syzkaller.test.db") if err != nil { |
