From fafc3ba45ec8582bc9bc57370927596eafbb8032 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 1 Sep 2025 22:01:29 +0200 Subject: [PATCH] fix(model): correctly handle block-aligned empty sparse files (fixes #10331) (#10332) When handling files that consist only of power-of-two-sized blocks of zero we'd know we have nothing to write, and when using sparse files we'd never even create the temp file. Hence the sync would fail. Signed-off-by: Jakob Borg --- lib/model/sharedpullerstate.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/model/sharedpullerstate.go b/lib/model/sharedpullerstate.go index d089da09f..dddbb4c36 100644 --- a/lib/model/sharedpullerstate.go +++ b/lib/model/sharedpullerstate.go @@ -324,6 +324,15 @@ func (s *sharedPullerState) finalClose() (bool, error) { return false, nil } + if s.writer == nil { + // If we didn't even create a temp file up to this point, now is the + // time to do so. This also truncates the file to the correct size + // if we're using sparse file. + if err := s.addWriterLocked(); err != nil { + return false, err + } + } + if len(s.file.Encrypted) > 0 { if err := s.finalizeEncrypted(); err != nil && s.err == nil { // This is our error as we weren't errored before. @@ -355,11 +364,6 @@ func (s *sharedPullerState) finalClose() (bool, error) { // folder from encrypted data we can extract this FileInfo from the end of // the file and regain the original metadata. func (s *sharedPullerState) finalizeEncrypted() error { - if s.writer == nil { - if err := s.addWriterLocked(); err != nil { - return err - } - } trailerSize, err := writeEncryptionTrailer(s.file, s.writer) if err != nil { return err