contentenc: rename PlaintextRange and CiphertextRange
The name could be misunderstood and actually caused a bug: doWrite used to always preallocate 4128 instead of the actual data length.
This commit is contained in:
parent
f2b4d57068
commit
7b22b426b9
|
@ -40,10 +40,16 @@ func New(cc *cryptocore.CryptoCore, plainBS uint64) *ContentEnc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PlainBS returns the plaintext block size
|
||||||
func (be *ContentEnc) PlainBS() uint64 {
|
func (be *ContentEnc) PlainBS() uint64 {
|
||||||
return be.plainBS
|
return be.plainBS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CipherBS returns the ciphertext block size
|
||||||
|
func (be *ContentEnc) CipherBS() uint64 {
|
||||||
|
return be.cipherBS
|
||||||
|
}
|
||||||
|
|
||||||
// DecryptBlocks - Decrypt a number of blocks
|
// DecryptBlocks - Decrypt a number of blocks
|
||||||
func (be *ContentEnc) DecryptBlocks(ciphertext []byte, firstBlockNo uint64, fileId []byte) ([]byte, error) {
|
func (be *ContentEnc) DecryptBlocks(ciphertext []byte, firstBlockNo uint64, fileId []byte) ([]byte, error) {
|
||||||
cBuf := bytes.NewBuffer(ciphertext)
|
cBuf := bytes.NewBuffer(ciphertext)
|
||||||
|
|
|
@ -16,16 +16,14 @@ func (ib *intraBlock) IsPartial() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// CiphertextRange - get byte range in ciphertext file corresponding to BlockNo
|
// BlockCipherOff returns the ciphertext offset corresponding to BlockNo
|
||||||
// (complete block)
|
func (ib *intraBlock) BlockCipherOff() (offset uint64) {
|
||||||
func (ib *intraBlock) CiphertextRange() (offset uint64, length uint64) {
|
return ib.fs.BlockNoToCipherOff(ib.BlockNo)
|
||||||
return ib.fs.BlockNoToCipherOff(ib.BlockNo), ib.fs.cipherBS
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PlaintextRange - get byte range in plaintext corresponding to BlockNo
|
// BlockPlainOff returns the plaintext offset corresponding to BlockNo
|
||||||
// (complete block)
|
func (ib *intraBlock) BlockPlainOff() (offset uint64) {
|
||||||
func (ib *intraBlock) PlaintextRange() (offset uint64, length uint64) {
|
return ib.fs.BlockNoToPlainOff(ib.BlockNo)
|
||||||
return ib.fs.BlockNoToPlainOff(ib.BlockNo), ib.fs.plainBS
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CropBlock - crop a potentially larger plaintext block down to the relevant part
|
// CropBlock - crop a potentially larger plaintext block down to the relevant part
|
||||||
|
|
|
@ -244,7 +244,7 @@ func (f *file) doWrite(data []byte, off int64) (uint32, fuse.Status) {
|
||||||
// Incomplete block -> Read-Modify-Write
|
// Incomplete block -> Read-Modify-Write
|
||||||
if b.IsPartial() {
|
if b.IsPartial() {
|
||||||
// Read
|
// Read
|
||||||
o, _ := b.PlaintextRange()
|
o := b.BlockPlainOff()
|
||||||
var oldData []byte
|
var oldData []byte
|
||||||
oldData, status = f.doRead(o, f.contentEnc.PlainBS())
|
oldData, status = f.doRead(o, f.contentEnc.PlainBS())
|
||||||
if status != fuse.OK {
|
if status != fuse.OK {
|
||||||
|
@ -257,13 +257,13 @@ func (f *file) doWrite(data []byte, off int64) (uint32, fuse.Status) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt
|
// Encrypt
|
||||||
blockOffset, blockLen := b.CiphertextRange()
|
blockOffset := b.BlockCipherOff()
|
||||||
blockData = f.contentEnc.EncryptBlock(blockData, b.BlockNo, f.header.Id)
|
blockData = f.contentEnc.EncryptBlock(blockData, b.BlockNo, f.header.Id)
|
||||||
tlog.Debug.Printf("ino%d: Writing %d bytes to block #%d",
|
tlog.Debug.Printf("ino%d: Writing %d bytes to block #%d",
|
||||||
f.ino, uint64(len(blockData))-f.contentEnc.BlockOverhead(), b.BlockNo)
|
f.ino, uint64(len(blockData))-f.contentEnc.BlockOverhead(), b.BlockNo)
|
||||||
|
|
||||||
// Prevent partially written (=corrupt) blocks by preallocating the space beforehand
|
// Prevent partially written (=corrupt) blocks by preallocating the space beforehand
|
||||||
err := prealloc(int(f.fd.Fd()), int64(blockOffset), int64(blockLen))
|
err := prealloc(int(f.fd.Fd()), int64(blockOffset), int64(len(blockData)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tlog.Warn.Printf("ino%d fh%d: doWrite: prealloc failed: %s", f.ino, f.intFd(), err.Error())
|
tlog.Warn.Printf("ino%d fh%d: doWrite: prealloc failed: %s", f.ino, f.intFd(), err.Error())
|
||||||
status = fuse.ToStatus(err)
|
status = fuse.ToStatus(err)
|
||||||
|
@ -410,12 +410,12 @@ func (f *file) Truncate(newSize uint64) fuse.Status {
|
||||||
}
|
}
|
||||||
lastBlock := addBlocks[len(addBlocks)-1]
|
lastBlock := addBlocks[len(addBlocks)-1]
|
||||||
if lastBlock.IsPartial() {
|
if lastBlock.IsPartial() {
|
||||||
off, _ := lastBlock.PlaintextRange()
|
off := lastBlock.BlockPlainOff()
|
||||||
_, status := f.doWrite(make([]byte, lastBlock.Length), int64(off+lastBlock.Skip))
|
_, status := f.doWrite(make([]byte, lastBlock.Length), int64(off+lastBlock.Skip))
|
||||||
return status
|
return status
|
||||||
} else {
|
} else {
|
||||||
off, length := lastBlock.CiphertextRange()
|
off := lastBlock.BlockCipherOff()
|
||||||
err = syscall.Ftruncate(f.intFd(), int64(off+length))
|
err = syscall.Ftruncate(f.intFd(), int64(off+f.contentEnc.CipherBS()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tlog.Warn.Printf("Truncate: grow Ftruncate returned error: %v", err)
|
tlog.Warn.Printf("Truncate: grow Ftruncate returned error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue