From 1ca58cc86190b92f22b36bc3993f1fb3e2337c02 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Sun, 24 Feb 2019 21:17:33 -0700
Subject: [PATCH] Close things whenever possible

Might be a fix for https://github.com/turt2live/matrix-media-repo/issues/92
---
 .../download_controller/download_controller.go         | 10 ++++++++--
 .../preview_controller/preview_controller.go           |  5 ++++-
 .../thumbnail_controller/thumbnail_controller.go       |  5 ++++-
 .../matrix-media-repo/internal_cache/media_cache.go    |  2 ++
 .../storage/datastore/ds_file/file_store.go            |  4 ++++
 .../storage/datastore/ds_s3/s3_store.go                |  3 +++
 6 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/src/github.com/turt2live/matrix-media-repo/controllers/download_controller/download_controller.go b/src/github.com/turt2live/matrix-media-repo/controllers/download_controller/download_controller.go
index 7017eb19..92936f80 100644
--- a/src/github.com/turt2live/matrix-media-repo/controllers/download_controller/download_controller.go
+++ b/src/github.com/turt2live/matrix-media-repo/controllers/download_controller/download_controller.go
@@ -124,7 +124,10 @@ func FindMinimalMediaRecord(origin string, mediaId string, downloadRemote bool,
 				return nil, common.ErrMediaNotFound
 			}
 
-			result := <-getResourceHandler().DownloadRemoteMedia(origin, mediaId, false)
+			mediaChan := getResourceHandler().DownloadRemoteMedia(origin, mediaId, true)
+			defer close(mediaChan)
+
+			result := <-mediaChan
 			if result.err != nil {
 				return nil, result.err
 			}
@@ -186,7 +189,10 @@ func FindMediaRecord(origin string, mediaId string, downloadRemote bool, ctx con
 				return nil, common.ErrMediaNotFound
 			}
 
-			result := <-getResourceHandler().DownloadRemoteMedia(origin, mediaId, true)
+			mediaChan := getResourceHandler().DownloadRemoteMedia(origin, mediaId, true)
+			defer close(mediaChan)
+
+			result := <-mediaChan
 			if result.err != nil {
 				return nil, result.err
 			}
diff --git a/src/github.com/turt2live/matrix-media-repo/controllers/preview_controller/preview_controller.go b/src/github.com/turt2live/matrix-media-repo/controllers/preview_controller/preview_controller.go
index c1bfa8de..ba565626 100644
--- a/src/github.com/turt2live/matrix-media-repo/controllers/preview_controller/preview_controller.go
+++ b/src/github.com/turt2live/matrix-media-repo/controllers/preview_controller/preview_controller.go
@@ -83,7 +83,10 @@ func GetPreview(urlStr string, onHost string, forUserId string, atTs int64, ctx
 		return nil, common.ErrHostBlacklisted
 	}
 
-	result := <-getResourceHandler().GeneratePreview(urlStr, forUserId, onHost)
+	previewChan := getResourceHandler().GeneratePreview(urlStr, forUserId, onHost)
+	defer close(previewChan)
+
+	result := <-previewChan
 	return result.preview, result.err
 }
 
diff --git a/src/github.com/turt2live/matrix-media-repo/controllers/thumbnail_controller/thumbnail_controller.go b/src/github.com/turt2live/matrix-media-repo/controllers/thumbnail_controller/thumbnail_controller.go
index 222d2ff9..0fa41194 100644
--- a/src/github.com/turt2live/matrix-media-repo/controllers/thumbnail_controller/thumbnail_controller.go
+++ b/src/github.com/turt2live/matrix-media-repo/controllers/thumbnail_controller/thumbnail_controller.go
@@ -179,7 +179,10 @@ func GetOrGenerateThumbnail(media *types.Media, width int, height int, animated
 
 	log.Info("Generating thumbnail")
 
-	result := <-getResourceHandler().GenerateThumbnail(media, width, height, method, animated)
+	thumbnailChan := getResourceHandler().GenerateThumbnail(media, width, height, method, animated)
+	defer close(thumbnailChan)
+
+	result := <-thumbnailChan
 	return result.thumbnail, result.err
 }
 
diff --git a/src/github.com/turt2live/matrix-media-repo/internal_cache/media_cache.go b/src/github.com/turt2live/matrix-media-repo/internal_cache/media_cache.go
index 3573fcba..9f66c245 100644
--- a/src/github.com/turt2live/matrix-media-repo/internal_cache/media_cache.go
+++ b/src/github.com/turt2live/matrix-media-repo/internal_cache/media_cache.go
@@ -105,6 +105,7 @@ func (c *MediaCache) GetMedia(media *types.Media, log *logrus.Entry) (*cachedFil
 		if err != nil {
 			return nil, err
 		}
+		defer mediaStream.Close()
 
 		return &cachedFile{media: media, Contents: bytes.NewBuffer(data)}, nil
 	}
@@ -127,6 +128,7 @@ func (c *MediaCache) GetThumbnail(thumbnail *types.Thumbnail, log *logrus.Entry)
 		if err != nil {
 			return nil, err
 		}
+		defer mediaStream.Close()
 
 		return &cachedFile{thumbnail: thumbnail, Contents: bytes.NewBuffer(data)}, nil
 	}
diff --git a/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_file/file_store.go b/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_file/file_store.go
index cf727bdb..b2a91eb4 100644
--- a/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_file/file_store.go
+++ b/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_file/file_store.go
@@ -14,6 +14,8 @@ import (
 )
 
 func PersistFile(basePath string, file io.ReadCloser, ctx context.Context, log *logrus.Entry) (*types.ObjectInfo, error) {
+	defer file.Close()
+
 	exists := true
 	var primaryContainer string
 	var secondaryContainer string
@@ -67,6 +69,8 @@ func PersistFile(basePath string, file io.ReadCloser, ctx context.Context, log *
 }
 
 func PersistFileAtLocation(targetFile string, file io.ReadCloser, ctx context.Context, log *logrus.Entry) (int64, string, error) {
+	defer file.Close()
+
 	f, err := os.OpenFile(targetFile, os.O_WRONLY|os.O_CREATE, 0644)
 	if err != nil {
 		return 0, "", err
diff --git a/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go b/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go
index 19130570..314e8496 100644
--- a/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go
+++ b/src/github.com/turt2live/matrix-media-repo/storage/datastore/ds_s3/s3_store.go
@@ -69,6 +69,8 @@ func (s *s3Datastore) EnsureBucketExists() error {
 }
 
 func (s *s3Datastore) UploadFile(file io.ReadCloser, ctx context.Context, log *logrus.Entry) (*types.ObjectInfo, error) {
+	defer file.Close()
+
 	objectName, err := util.GenerateRandomString(512)
 	if err != nil {
 		return nil, err
@@ -141,6 +143,7 @@ func (s *s3Datastore) ObjectExists(location string) bool {
 }
 
 func (s *s3Datastore) OverwriteObject(location string, stream io.ReadCloser) error {
+	defer stream.Close()
 	_, err := s.client.PutObject(s.bucket, location, stream, -1, minio.PutObjectOptions{})
 	return err
 }
-- 
GitLab