Quellcode durchsuchen

lib/model: Fix enc file size when pulling (fixes #7152) (#7155)

Simon Frei vor 5 Jahren
Ursprung
Commit
bf7d03d029
2 geänderte Dateien mit 10 neuen und 5 gelöschten Zeilen
  1. 4 0
      lib/model/folder_sendrecv.go
  2. 6 5
      lib/model/sharedpullerstate.go

+ 4 - 0
lib/model/folder_sendrecv.go

@@ -1695,6 +1695,7 @@ func (f *sendReceiveFolder) dbUpdaterRoutine(dbUpdateChan <-chan dbUpdateJob) {
 		return nil
 	}
 
+	recvEnc := f.Type == config.FolderTypeReceiveEncrypted
 loop:
 	for {
 		select {
@@ -1706,6 +1707,9 @@ 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:

+ 6 - 5
lib/model/sharedpullerstate.go

@@ -192,7 +192,7 @@ func (s *sharedPullerState) tempFileInWritableDir(_ string) error {
 		size := s.file.Size
 		// Trailer added to encrypted files
 		if len(s.file.Encrypted) > 0 {
-			size += int64(s.file.ProtoSize() + 4)
+			size += encryptionTrailerSize(s.file)
 		}
 		// Truncate sets the size of the file. This creates a sparse file or a
 		// space reservation, depending on the underlying filesystem.
@@ -346,8 +346,7 @@ 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 {
-	size := s.file.ProtoSize()
-	bs := make([]byte, 4+size)
+	bs := make([]byte, encryptionTrailerSize(s.file))
 	n, err := s.file.MarshalTo(bs)
 	if err != nil {
 		return err
@@ -364,11 +363,13 @@ func (s *sharedPullerState) finalizeEncrypted() error {
 		return err
 	}
 
-	s.file.Size += int64(len(bs))
-
 	return nil
 }
 
+func encryptionTrailerSize(file protocol.FileInfo) int64 {
+	return int64(file.ProtoSize()) + 4
+}
+
 // Progress returns the momentarily progress for the puller
 func (s *sharedPullerState) Progress() *pullerProgress {
 	s.mut.RLock()