diff options
| author | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2025-06-19 15:33:04 -0700 |
|---|---|---|
| committer | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2025-06-19 15:39:05 -0700 |
| commit | 5cc6ed27177304f743ebefc79fa3a17481bf8c98 (patch) | |
| tree | 3ace51e53bf2197e05935876d66900edda1ce8fd /hotline/file_transfer.go | |
| parent | 8e563cf7f9bda27105383a68ec2e902a62bfd50d (diff) | |
Ensure temporary upload files are closed before rename
This seems to be important on Windows! See #161
Diffstat (limited to 'hotline/file_transfer.go')
| -rw-r--r-- | hotline/file_transfer.go | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/hotline/file_transfer.go b/hotline/file_transfer.go index 626cfff..f09e995 100644 --- a/hotline/file_transfer.go +++ b/hotline/file_transfer.go @@ -318,15 +318,16 @@ func UploadHandler(rwc io.ReadWriter, fullPath string, fileTransfer *FileTransfe if err == nil { return fmt.Errorf("existing file found: %s", fullPath) } - if errors.Is(err, fs.ErrNotExist) { - // If not found, open or create a new .incomplete file - file, err = os.OpenFile(fullPath+IncompleteFileSuffix, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) - if err != nil { - return err - } + + if !errors.Is(err, fs.ErrNotExist) { + return fmt.Errorf("check file existence: %w", err) } - defer file.Close() + // If not found, open or create a new .incomplete file + file, err = os.OpenFile(fullPath+IncompleteFileSuffix, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + return fmt.Errorf("open temp file for uploade: %w", err) + } f, err := NewFileWrapper(fileStore, fullPath, 0) if err != nil { @@ -350,9 +351,16 @@ func UploadHandler(rwc io.ReadWriter, fullPath string, fileTransfer *FileTransfe } if err := receiveFile(rwc, file, rForkWriter, iForkWriter, fileTransfer.bytesSentCounter); err != nil { + _ = file.Close() // Close on error return fmt.Errorf("receive file: %v", err) } + // Close the file before attempting to rename it. + if err := file.Close(); err != nil { + return fmt.Errorf("close file: %v", err) + } + + // Rename the temporary upload file to the final file name. if err := fileStore.Rename(fullPath+".incomplete", fullPath); err != nil { return fmt.Errorf("rename incomplete file: %v", err) } @@ -665,6 +673,12 @@ func UploadFolderHandler(rwc io.ReadWriter, fullPath string, fileTransfer *FileT return err } + // Close the file before attempting to rename it. + if err := incWriter.Close(); err != nil { + return fmt.Errorf("close file: %v", err) + } + + // Rename the temporary upload file to the final file name. if err := os.Rename(filePath+".incomplete", filePath); err != nil { return err } |