@@ -22,29 +22,41 @@ func (h *hbshVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag,
22
22
}
23
23
24
24
func (h * hbshVFS ) OpenParams (name string , flags vfs.OpenFlag , params url.Values ) (file vfs.File , _ vfs.OpenFlag , err error ) {
25
+ encrypt := flags & (0 |
26
+ vfs .OPEN_MAIN_DB |
27
+ vfs .OPEN_MAIN_JOURNAL |
28
+ vfs .OPEN_SUBJOURNAL |
29
+ vfs .OPEN_WAL ) != 0
30
+
31
+ var hbsh * hbsh.HBSH
32
+ if encrypt {
33
+ var key []byte
34
+ if t , ok := params ["key" ]; ok {
35
+ key = []byte (t [0 ])
36
+ } else if t , ok := params ["hexkey" ]; ok {
37
+ key , _ = hex .DecodeString (t [0 ])
38
+ } else if t , ok := params ["textkey" ]; ok {
39
+ key = h .hbsh .KDF (t [0 ])
40
+ }
41
+
42
+ if hbsh = h .hbsh .HBSH (key ); hbsh == nil {
43
+ return nil , flags , sqlite3 .NOTADB
44
+ }
45
+ }
46
+
25
47
if h , ok := h .VFS .(vfs.VFSParams ); ok {
48
+ delete (params , "vfs" )
49
+ delete (params , "key" )
50
+ delete (params , "hexkey" )
51
+ delete (params , "textkey" )
26
52
file , flags , err = h .OpenParams (name , flags , params )
27
53
} else {
28
54
file , flags , err = h .Open (name , flags )
29
55
}
30
- if err != nil || flags & (0 |
31
- vfs .OPEN_MAIN_DB |
32
- vfs .OPEN_MAIN_JOURNAL |
33
- vfs .OPEN_SUBJOURNAL |
34
- vfs .OPEN_WAL ) == 0 {
56
+ if err != nil || hbsh == nil {
35
57
return file , flags , err
36
58
}
37
-
38
- var key []byte
39
- if t , ok := params ["key" ]; ok {
40
- key = []byte (t [0 ])
41
- } else if t , ok := params ["hexkey" ]; ok {
42
- key , err = hex .DecodeString (t [0 ])
43
- } else if t , ok := params ["textkey" ]; ok {
44
- key = h .hbsh .KDF (t [0 ])
45
- }
46
-
47
- return & hbshFile {File : file , hbsh : h .hbsh .HBSH (key )}, flags , err
59
+ return & hbshFile {File : file , hbsh : hbsh }, flags , err
48
60
}
49
61
50
62
const (
@@ -93,20 +105,22 @@ func (h *hbshFile) WriteAt(p []byte, off int64) (n int, err error) {
93
105
binary .LittleEndian .PutUint64 (h .tweak [:], uint64 (min ))
94
106
data := h .block [:]
95
107
96
- if min < off || len (p [n :]) < blockSize {
108
+ if off > min || len (p [n :]) < blockSize {
97
109
// Read full block.
98
110
m , err := h .File .ReadAt (h .block [:], min )
99
- switch {
100
- case m == 0 && err == io .EOF :
101
- clear (data )
102
- case m != blockSize :
103
- return n , err
104
- default :
105
- // Partial update.
106
- data = h .hbsh .Decrypt (h .block [:], h .tweak [:])
107
- if off > min {
108
- data = data [off - min :]
111
+ if m != blockSize {
112
+ if err != io .EOF {
113
+ return n , err
109
114
}
115
+ // Writing past the EOF.
116
+ // A partially written block is corrupt,
117
+ // and also considered to be past the EOF.
118
+ clear (data )
119
+ }
120
+
121
+ data = h .hbsh .Decrypt (h .block [:], h .tweak [:])
122
+ if off > min {
123
+ data = data [off - min :]
110
124
}
111
125
}
112
126
0 commit comments