aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2019-01-04 20:23:01 +0100
committerJakob Unterwurzacher2019-01-04 20:26:16 +0100
commitc1a2a36a7928953e88e53edb5cb86c7dd6ede21f (patch)
tree660c4b9a2182318b79e096f49534ec02a52e61a4
parent4b1d080673603e506e3d22a04f7f98f4bc3915e1 (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.
-rw-r--r--fsck.go9
1 files changed, 6 insertions, 3 deletions
diff --git a/fsck.go b/fsck.go
index 27612c8..8dbef09 100644
--- a/fsck.go
+++ b/fsck.go
@@ -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)