summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Frei <freisim93@gmail.com>2023-03-28 22:02:59 +0200
committerGitHub <noreply@github.com>2023-03-28 22:02:59 +0200
commit6a66aee48942b4598c6ff7fcaf7b9a369da9a330 (patch)
tree4f02792cdb64fa294fed48001a97cda38f5c4d52
parent51e85d51622b30ce792bba0b5bbc019902919c5d (diff)
lib/model: Fix file size inconsistency due to enc. trailer (#8840)
lib/model: Fix file size inconsisency due to enc. trailer Fixes a regression due to PR #8563, while arguable the bug was actually introduced in a much older PR #7155, but didn't have any bad effects so far: We account for the encryption trailer in the db updater routine, calculating the file-info size there. However there's no guarantee that the file-info at this point is still the exact same as when it was written. It was before, but isn't anymore since introducing the new EncryptedTrailerSize field. Fix: Adjust the size in the info at the same place where the trailer is written, i.e. we definitely have the actual size on disk.
-rw-r--r--lib/model/folder_sendrecv.go9
-rw-r--r--lib/model/sharedpullerstate.go8
2 files changed, 9 insertions, 8 deletions
diff --git a/lib/model/folder_sendrecv.go b/lib/model/folder_sendrecv.go
index 4b3da2722a..f71407e31e 100644
--- a/lib/model/folder_sendrecv.go
+++ b/lib/model/folder_sendrecv.go
@@ -1251,11 +1251,12 @@ func (f *sendReceiveFolder) shortcutFile(file protocol.FileInfo, dbUpdateChan ch
}
defer fd.Close()
trailerSize, err := writeEncryptionTrailer(file, fd)
- file.EncryptionTrailerSize = int(trailerSize)
if err != nil {
return err
}
- return fd.Truncate(file.Size + trailerSize)
+ file.EncryptionTrailerSize = int(trailerSize)
+ file.Size += trailerSize
+ return fd.Truncate(file.Size)
}, f.mtimefs, file.Name, true)
if err != nil {
f.newPullError(file.Name, fmt.Errorf("writing encrypted file trailer: %w", err))
@@ -1744,7 +1745,6 @@ func (f *sendReceiveFolder) dbUpdaterRoutine(dbUpdateChan <-chan dbUpdateJob) {
return nil
})
- recvEnc := f.Type == config.FolderTypeReceiveEncrypted
loop:
for {
select {
@@ -1756,9 +1756,6 @@ loop:
switch job.jobType {
case dbUpdateHandleFile, dbUpdateShortcutFile:
changedDirs[filepath.Dir(job.file.Name)] = struct{}{}
- if recvEnc {
- job.file.Size += encryptionTrailerSize(job.file)
- }
case dbUpdateHandleDir:
changedDirs[job.file.Name] = struct{}{}
case dbUpdateHandleSymlink, dbUpdateInvalidate:
diff --git a/lib/model/sharedpullerstate.go b/lib/model/sharedpullerstate.go
index 1248e504b9..9a868a2fb2 100644
--- a/lib/model/sharedpullerstate.go
+++ b/lib/model/sharedpullerstate.go
@@ -352,8 +352,12 @@ func (s *sharedPullerState) finalizeEncrypted() error {
return err
}
}
- _, err := writeEncryptionTrailer(s.file, s.writer)
- return err
+ trailerSize, err := writeEncryptionTrailer(s.file, s.writer)
+ if err != nil {
+ return err
+ }
+ s.file.Size += trailerSize
+ return nil
}
// Returns the size of the written trailer.