diff options
author | Jakob Unterwurzacher | 2019-01-04 20:23:01 +0100 |
---|---|---|
committer | Jakob Unterwurzacher | 2019-01-04 20:26:16 +0100 |
commit | c1a2a36a7928953e88e53edb5cb86c7dd6ede21f (patch) | |
tree | 660c4b9a2182318b79e096f49534ec02a52e61a4 /fsck.go | |
parent | 4b1d080673603e506e3d22a04f7f98f4bc3915e1 (diff) |
fsck: don't misdetect a file hole at EOF
https://github.com/rfjakob/gocryptfs/issues/304 :
A second minor issue is that `if bytes.Equal(buf, allZero) {` compares the whole
buffer, although the last read could have been shorter. This could trigger the
"skip file hole" code at the end of a file although there isn't any hole to
skip.
Diffstat (limited to 'fsck.go')
-rw-r--r-- | fsck.go | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -153,6 +153,7 @@ func (ck *fsckObj) file(path string) { return } defer f.Release() + // 128 kiB of zeros allZero := make([]byte, fuse.MAX_KERNEL_WRITE) buf := make([]byte, fuse.MAX_KERNEL_WRITE) var off int64 @@ -167,14 +168,16 @@ func (ck *fsckObj) file(path string) { fmt.Printf("fsck: error reading file %q (inum %d): %v\n", path, inum(f), status) return } + n := result.Size() // EOF - if result.Size() == 0 { + if n == 0 { return } - off += int64(result.Size()) + off += int64(n) // If we seem to be in the middle of a file hole, try to skip to the next // data section. - if bytes.Equal(buf, allZero) { + data := buf[:n] + if bytes.Equal(data, allZero) { tlog.Debug.Printf("ck.file: trying to skip file hole\n") f2 := f.(*fusefrontend.File) nextOff, err := f2.SeekData(off) |