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 | |
| 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.
| -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) | 
