nametransform: reject all-zero dirIV
This should never happen in normal operation and is a sign of data corruption. Catch it early.
This commit is contained in:
parent
2ce269ec63
commit
9a3f9350fe
@ -1,6 +1,7 @@
|
|||||||
package nametransform
|
package nametransform
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -46,6 +47,9 @@ func ReadDirIVAt(dirfd *os.File) (iv []byte, err error) {
|
|||||||
return fdReadDirIV(fd)
|
return fdReadDirIV(fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// allZeroDirIV is preallocated to quickly check if the data read from disk is all zero
|
||||||
|
var allZeroDirIV = make([]byte, DirIVLen)
|
||||||
|
|
||||||
// fdReadDirIV reads and verifies the DirIV from an opened gocryptfs.diriv file.
|
// fdReadDirIV reads and verifies the DirIV from an opened gocryptfs.diriv file.
|
||||||
func fdReadDirIV(fd *os.File) (iv []byte, err error) {
|
func fdReadDirIV(fd *os.File) (iv []byte, err error) {
|
||||||
// We want to detect if the file is bigger than DirIVLen, so
|
// We want to detect if the file is bigger than DirIVLen, so
|
||||||
@ -61,6 +65,10 @@ func fdReadDirIV(fd *os.File) (iv []byte, err error) {
|
|||||||
tlog.Warn.Printf("ReadDirIVAt: wanted %d bytes, got %d. Returning EINVAL.", DirIVLen, len(iv))
|
tlog.Warn.Printf("ReadDirIVAt: wanted %d bytes, got %d. Returning EINVAL.", DirIVLen, len(iv))
|
||||||
return nil, syscall.EINVAL
|
return nil, syscall.EINVAL
|
||||||
}
|
}
|
||||||
|
if bytes.Equal(iv, allZeroDirIV) {
|
||||||
|
tlog.Warn.Printf("ReadDirIVAt: diriv is all-zero. Returning EINVAL.")
|
||||||
|
return nil, syscall.EINVAL
|
||||||
|
}
|
||||||
return iv, nil
|
return iv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user