From eb5de339f17ff9901ef3f0568620e860f5cfe19d Mon Sep 17 00:00:00 2001 From: Prateek Sachan Date: Sat, 28 Mar 2020 17:41:50 +0530 Subject: [PATCH] fix temp file delete on error --- mediaapi/fileutils/fileutils.go | 6 +++++- mediaapi/routing/download.go | 3 +-- mediaapi/routing/upload.go | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/mediaapi/fileutils/fileutils.go b/mediaapi/fileutils/fileutils.go index 1de242a00..d6badcb94 100644 --- a/mediaapi/fileutils/fileutils.go +++ b/mediaapi/fileutils/fileutils.go @@ -105,7 +105,9 @@ func RemoveDir(dir types.Path, logger *log.Entry) { } // WriteTempFile writes to a new temporary file -func WriteTempFile(reqReader io.Reader, maxFileSizeBytes config.FileSizeBytes, absBasePath config.Path) (hash types.Base64Hash, size types.FileSizeBytes, path types.Path, err error) { +// and deletes the file if an error is occurred while writing. +// A log entry is needed to log the log the errors on deleting. +func WriteTempFile(reqReader io.Reader, maxFileSizeBytes config.FileSizeBytes, absBasePath config.Path, logger *log.Entry) (hash types.Base64Hash, size types.FileSizeBytes, path types.Path, err error) { size = -1 tmpFileWriter, tmpFile, tmpDir, err := createTempFileWriter(absBasePath) @@ -123,11 +125,13 @@ func WriteTempFile(reqReader io.Reader, maxFileSizeBytes config.FileSizeBytes, a teeReader := io.TeeReader(limitedReader, hasher) bytesWritten, err := io.Copy(tmpFileWriter, teeReader) if err != nil && err != io.EOF { + RemoveDir(tmpDir, logger) return } err = tmpFileWriter.Flush() if err != nil { + RemoveDir(tmpDir, logger) return } diff --git a/mediaapi/routing/download.go b/mediaapi/routing/download.go index 8544bd64f..9b23556d5 100644 --- a/mediaapi/routing/download.go +++ b/mediaapi/routing/download.go @@ -643,12 +643,11 @@ func (r *downloadRequest) fetchRemoteFile( // method of deduplicating files to save storage, as well as a way to conduct // integrity checks on the file data in the repository. // Data is truncated to maxFileSizeBytes. Content-Length was reported as 0 < Content-Length <= maxFileSizeBytes so this is OK. - hash, bytesWritten, tmpDir, err := fileutils.WriteTempFile(resp.Body, maxFileSizeBytes, absBasePath) + hash, bytesWritten, tmpDir, err := fileutils.WriteTempFile(resp.Body, maxFileSizeBytes, absBasePath, r.Logger) if err != nil { r.Logger.WithError(err).WithFields(log.Fields{ "MaxFileSizeBytes": maxFileSizeBytes, }).Warn("Error while downloading file from remote server") - fileutils.RemoveDir(tmpDir, r.Logger) return "", false, errors.New("file could not be downloaded from remote server") } diff --git a/mediaapi/routing/upload.go b/mediaapi/routing/upload.go index 91a453190..62d70bf75 100644 --- a/mediaapi/routing/upload.go +++ b/mediaapi/routing/upload.go @@ -109,12 +109,11 @@ func (r *uploadRequest) doUpload( // method of deduplicating files to save storage, as well as a way to conduct // integrity checks on the file data in the repository. // Data is truncated to maxFileSizeBytes. Content-Length was reported as 0 < Content-Length <= maxFileSizeBytes so this is OK. - hash, bytesWritten, tmpDir, err := fileutils.WriteTempFile(reqReader, *cfg.Media.MaxFileSizeBytes, cfg.Media.AbsBasePath) + hash, bytesWritten, tmpDir, err := fileutils.WriteTempFile(reqReader, *cfg.Media.MaxFileSizeBytes, cfg.Media.AbsBasePath, r.Logger) if err != nil { r.Logger.WithError(err).WithFields(log.Fields{ "MaxFileSizeBytes": *cfg.Media.MaxFileSizeBytes, }).Warn("Error while transferring file") - fileutils.RemoveDir(tmpDir, r.Logger) return &util.JSONResponse{ Code: http.StatusBadRequest, JSON: jsonerror.Unknown("Failed to upload"), @@ -139,6 +138,7 @@ func (r *uploadRequest) doUpload( ctx, r.MediaMetadata.MediaID, r.MediaMetadata.Origin, ) if err != nil { + fileutils.RemoveDir(tmpDir, r.Logger) r.Logger.WithError(err).Error("Error querying the database.") resErr := jsonerror.InternalServerError() return &resErr