From 296bdf3af21a8964dcb884ff41ea7556cc811e9a Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 15 Nov 2015 14:15:21 +0100 Subject: [PATCH] CipherSizeToPlainSize: Handle illegal states A file never gets a cipherSize <= HEADER_LEN in normal operation. However, this can happen if header write it interrupted or the underlying filesystem does not support fallocate. Noticed while trying to store a CIPHERDIR in another gocryptfs mount (gocryptfs does not support fallocate) --- cryptfs/address_translation.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cryptfs/address_translation.go b/cryptfs/address_translation.go index dfc6ef9..147040c 100644 --- a/cryptfs/address_translation.go +++ b/cryptfs/address_translation.go @@ -30,6 +30,16 @@ func (be *CryptFS) CipherSizeToPlainSize(cipherSize uint64) uint64 { return 0 } + if cipherSize == HEADER_LEN { + Warn.Printf("cipherSize %d == header size: interrupted write?\n", cipherSize) + return 0 + } + + if cipherSize < HEADER_LEN { + Warn.Printf("cipherSize %d < header size: corrupt file\n", cipherSize) + return 0 + } + // Block number at last byte blockNo := be.CipherOffToBlockNo(cipherSize - 1) blockCount := blockNo + 1