Skip to content

Commit 5cc6ed2

Browse files
committed
Ensure temporary upload files are closed before rename
This seems to be important on Windows! See #161
1 parent 8e563cf commit 5cc6ed2

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

hotline/file_transfer.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,16 @@ func UploadHandler(rwc io.ReadWriter, fullPath string, fileTransfer *FileTransfe
318318
if err == nil {
319319
return fmt.Errorf("existing file found: %s", fullPath)
320320
}
321-
if errors.Is(err, fs.ErrNotExist) {
322-
// If not found, open or create a new .incomplete file
323-
file, err = os.OpenFile(fullPath+IncompleteFileSuffix, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
324-
if err != nil {
325-
return err
326-
}
321+
322+
if !errors.Is(err, fs.ErrNotExist) {
323+
return fmt.Errorf("check file existence: %w", err)
327324
}
328325

329-
defer file.Close()
326+
// If not found, open or create a new .incomplete file
327+
file, err = os.OpenFile(fullPath+IncompleteFileSuffix, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
328+
if err != nil {
329+
return fmt.Errorf("open temp file for uploade: %w", err)
330+
}
330331

331332
f, err := NewFileWrapper(fileStore, fullPath, 0)
332333
if err != nil {
@@ -350,9 +351,16 @@ func UploadHandler(rwc io.ReadWriter, fullPath string, fileTransfer *FileTransfe
350351
}
351352

352353
if err := receiveFile(rwc, file, rForkWriter, iForkWriter, fileTransfer.bytesSentCounter); err != nil {
354+
_ = file.Close() // Close on error
353355
return fmt.Errorf("receive file: %v", err)
354356
}
355357

358+
// Close the file before attempting to rename it.
359+
if err := file.Close(); err != nil {
360+
return fmt.Errorf("close file: %v", err)
361+
}
362+
363+
// Rename the temporary upload file to the final file name.
356364
if err := fileStore.Rename(fullPath+".incomplete", fullPath); err != nil {
357365
return fmt.Errorf("rename incomplete file: %v", err)
358366
}
@@ -665,6 +673,12 @@ func UploadFolderHandler(rwc io.ReadWriter, fullPath string, fileTransfer *FileT
665673
return err
666674
}
667675

676+
// Close the file before attempting to rename it.
677+
if err := incWriter.Close(); err != nil {
678+
return fmt.Errorf("close file: %v", err)
679+
}
680+
681+
// Rename the temporary upload file to the final file name.
668682
if err := os.Rename(filePath+".incomplete", filePath); err != nil {
669683
return err
670684
}

0 commit comments

Comments
 (0)