From c392af365fc93921e6fe3537a0d2f30987878da3 Mon Sep 17 00:00:00 2001
From: George Claghorn <george@basecamp.com>
Date: Fri, 26 Jan 2018 19:48:32 -0500
Subject: Unlink internal tempfiles after use

---
 activestorage/lib/active_storage/downloading.rb | 12 +++++++++++-
 activestorage/lib/active_storage/previewer.rb   | 12 +++++++++++-
 2 files changed, 22 insertions(+), 2 deletions(-)

(limited to 'activestorage')

diff --git a/activestorage/lib/active_storage/downloading.rb b/activestorage/lib/active_storage/downloading.rb
index 295289c1e7..f2a1fffdcb 100644
--- a/activestorage/lib/active_storage/downloading.rb
+++ b/activestorage/lib/active_storage/downloading.rb
@@ -7,12 +7,22 @@ module ActiveStorage
     private
       # Opens a new tempfile in #tempdir and copies blob data into it. Yields the tempfile.
       def download_blob_to_tempfile #:doc:
-        Tempfile.open([ "ActiveStorage", blob.filename.extension_with_delimiter ], tempdir) do |file|
+        open_tempfile_for_blob do |file|
           download_blob_to file
           yield file
         end
       end
 
+      def open_tempfile_for_blob
+        tempfile = Tempfile.open([ "ActiveStorage", blob.filename.extension_with_delimiter ], tempdir)
+
+        begin
+          yield tempfile
+        ensure
+          tempfile.close!
+        end
+      end
+
       # Efficiently downloads blob data into the given file.
       def download_blob_to(file) #:doc:
         file.binmode
diff --git a/activestorage/lib/active_storage/previewer.rb b/activestorage/lib/active_storage/previewer.rb
index dacab1e7df..cf19987d72 100644
--- a/activestorage/lib/active_storage/previewer.rb
+++ b/activestorage/lib/active_storage/previewer.rb
@@ -44,13 +44,23 @@ module ActiveStorage
       # The output tempfile is opened in the directory returned by ActiveStorage::Downloading#tempdir.
       def draw(*argv) #:doc:
         ActiveSupport::Notifications.instrument("preview.active_storage") do
-          Tempfile.open("ActiveStorage", tempdir) do |file|
+          open_tempfile_for_drawing do |file|
             capture(*argv, to: file)
             yield file
           end
         end
       end
 
+      def open_tempfile_for_drawing
+        tempfile = Tempfile.open("ActiveStorage", tempdir)
+
+        begin
+          yield tempfile
+        ensure
+          tempfile.close!
+        end
+      end
+
       def capture(*argv, to:)
         to.binmode
         IO.popen(argv, err: File::NULL) { |out| IO.copy_stream(out, to) }
-- 
cgit v1.2.3