@@ -47,11 +47,12 @@ type cksmFlags struct {
47
47
48
48
func (c cksmFile ) ReadAt (p []byte , off int64 ) (n int , err error ) {
49
49
n , err = c .File .ReadAt (p , off )
50
+ p = p [:n ]
50
51
51
52
// SQLite is reading the header of a database file.
52
53
if c .isDB && off == 0 && len (p ) >= 100 &&
53
54
bytes .HasPrefix (p , []byte ("SQLite format 3\000 " )) {
54
- c .init (p )
55
+ c .init (( * [ 100 ] byte )( p ) )
55
56
}
56
57
57
58
// Verify checksums.
@@ -69,7 +70,7 @@ func (c cksmFile) WriteAt(p []byte, off int64) (n int, err error) {
69
70
// SQLite is writing the first page of a database file.
70
71
if c .isDB && off == 0 && len (p ) >= 100 &&
71
72
bytes .HasPrefix (p , []byte ("SQLite format 3\000 " )) {
72
- c .init (p )
73
+ c .init (( * [ 100 ] byte )( p ) )
73
74
}
74
75
75
76
// Compute checksums.
@@ -122,12 +123,16 @@ func (c cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpco
122
123
return vfsFileControlImpl (ctx , mod , c .File , op , pArg )
123
124
}
124
125
125
- func (f * cksmFlags ) init (header [ ]byte ) {
126
+ func (f * cksmFlags ) init (header * [ 100 ]byte ) {
126
127
f .pageSize = 256 * int (binary .LittleEndian .Uint16 (header [16 :18 ]))
127
128
if r := header [20 ] == 8 ; r != f .computeCksm {
128
129
f .computeCksm = r
129
130
f .verifyCksm = r
130
131
}
132
+ if ! sql3util .ValidPageSize (f .pageSize ) {
133
+ f .computeCksm = false
134
+ f .verifyCksm = false
135
+ }
131
136
}
132
137
133
138
func cksmCompute (a []byte ) (cksm [8 ]byte ) {
0 commit comments