diff options
author | Simon Frei <freisim93@gmail.com> | 2023-03-28 22:02:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-28 22:02:59 +0200 |
commit | 6a66aee48942b4598c6ff7fcaf7b9a369da9a330 (patch) | |
tree | 4f02792cdb64fa294fed48001a97cda38f5c4d52 | |
parent | 51e85d51622b30ce792bba0b5bbc019902919c5d (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.go | 9 | ||||
-rw-r--r-- | lib/model/sharedpullerstate.go | 8 |
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. |