mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-16 19:33:09 -06:00
fix temp file delete on error
This commit is contained in:
parent
05e1ae8745
commit
eb5de339f1
|
|
@ -105,7 +105,9 @@ func RemoveDir(dir types.Path, logger *log.Entry) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteTempFile writes to a new temporary file
|
// 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
|
size = -1
|
||||||
|
|
||||||
tmpFileWriter, tmpFile, tmpDir, err := createTempFileWriter(absBasePath)
|
tmpFileWriter, tmpFile, tmpDir, err := createTempFileWriter(absBasePath)
|
||||||
|
|
@ -123,11 +125,13 @@ func WriteTempFile(reqReader io.Reader, maxFileSizeBytes config.FileSizeBytes, a
|
||||||
teeReader := io.TeeReader(limitedReader, hasher)
|
teeReader := io.TeeReader(limitedReader, hasher)
|
||||||
bytesWritten, err := io.Copy(tmpFileWriter, teeReader)
|
bytesWritten, err := io.Copy(tmpFileWriter, teeReader)
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
|
RemoveDir(tmpDir, logger)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tmpFileWriter.Flush()
|
err = tmpFileWriter.Flush()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
RemoveDir(tmpDir, logger)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -643,12 +643,11 @@ func (r *downloadRequest) fetchRemoteFile(
|
||||||
// method of deduplicating files to save storage, as well as a way to conduct
|
// method of deduplicating files to save storage, as well as a way to conduct
|
||||||
// integrity checks on the file data in the repository.
|
// 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.
|
// 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 {
|
if err != nil {
|
||||||
r.Logger.WithError(err).WithFields(log.Fields{
|
r.Logger.WithError(err).WithFields(log.Fields{
|
||||||
"MaxFileSizeBytes": maxFileSizeBytes,
|
"MaxFileSizeBytes": maxFileSizeBytes,
|
||||||
}).Warn("Error while downloading file from remote server")
|
}).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")
|
return "", false, errors.New("file could not be downloaded from remote server")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,12 +109,11 @@ func (r *uploadRequest) doUpload(
|
||||||
// method of deduplicating files to save storage, as well as a way to conduct
|
// method of deduplicating files to save storage, as well as a way to conduct
|
||||||
// integrity checks on the file data in the repository.
|
// 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.
|
// 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 {
|
if err != nil {
|
||||||
r.Logger.WithError(err).WithFields(log.Fields{
|
r.Logger.WithError(err).WithFields(log.Fields{
|
||||||
"MaxFileSizeBytes": *cfg.Media.MaxFileSizeBytes,
|
"MaxFileSizeBytes": *cfg.Media.MaxFileSizeBytes,
|
||||||
}).Warn("Error while transferring file")
|
}).Warn("Error while transferring file")
|
||||||
fileutils.RemoveDir(tmpDir, r.Logger)
|
|
||||||
return &util.JSONResponse{
|
return &util.JSONResponse{
|
||||||
Code: http.StatusBadRequest,
|
Code: http.StatusBadRequest,
|
||||||
JSON: jsonerror.Unknown("Failed to upload"),
|
JSON: jsonerror.Unknown("Failed to upload"),
|
||||||
|
|
@ -139,6 +138,7 @@ func (r *uploadRequest) doUpload(
|
||||||
ctx, r.MediaMetadata.MediaID, r.MediaMetadata.Origin,
|
ctx, r.MediaMetadata.MediaID, r.MediaMetadata.Origin,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fileutils.RemoveDir(tmpDir, r.Logger)
|
||||||
r.Logger.WithError(err).Error("Error querying the database.")
|
r.Logger.WithError(err).Error("Error querying the database.")
|
||||||
resErr := jsonerror.InternalServerError()
|
resErr := jsonerror.InternalServerError()
|
||||||
return &resErr
|
return &resErr
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue