aboutsummaryrefslogtreecommitdiff
path: root/hotline/file_transfer.go
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2025-06-19 15:33:04 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2025-06-19 15:39:05 -0700
commit5cc6ed27177304f743ebefc79fa3a17481bf8c98 (patch)
tree3ace51e53bf2197e05935876d66900edda1ce8fd /hotline/file_transfer.go
parent8e563cf7f9bda27105383a68ec2e902a62bfd50d (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.go28
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
}