Bläddra i källkod

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 <[email protected]>
Jakob Borg 3 månader sedan
förälder
incheckning
fafc3ba45e
1 ändrade filer med 9 tillägg och 5 borttagningar
  1. 9 5
      lib/model/sharedpullerstate.go

+ 9 - 5
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