aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2021-12-09 09:01:32 +0100
committerDmitry Vyukov <dvyukov@google.com>2021-12-09 13:56:10 +0100
commita254b0f5219f1bc666975348b583795a324085cb (patch)
treee9f58ad20bb1eb887216b762457eb75ce0905db8 /pkg
parenta4a2a50158b25d4af0fd07528f38e6656b903d68 (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.go15
-rw-r--r--pkg/db/db_test.go17
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 {