From 82b86b4c97963d25c4e8ba12aab327d47c1f5861 Mon Sep 17 00:00:00 2001 From: Ellen Marie Dash Date: Thu, 30 Jun 2022 20:28:33 -0400 Subject: [rubygems/rubygems] Delete partial file and re-raise on Errno::ENOSPC. Add test for not leaving empty files if ENOSPC is raised during 'gem install' https://github.com/rubygems/rubygems/commit/8e0e20f079 --- lib/rubygems.rb | 4 ++++ test/rubygems/test_gem_installer.rb | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib/rubygems.rb b/lib/rubygems.rb index a869fc4c45..0c0ca9c1ba 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -774,6 +774,10 @@ An Array (#{env.inspect}) was passed in from #{caller[3]} open_file(path, "wb") do |io| io.write data end + rescue Errno::ENOSPC + # If we ran out of space but the file exists, it's *guaranteed* to be corrupted. + File.delete(path) if File.exist?(path) + raise end ## diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index 0d0746ec84..f9209350fb 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -2222,6 +2222,37 @@ gem 'other', version assert_equal @spec, eval(File.read(@spec.spec_file)) end + def test_leaves_no_empty_cached_spec_when_no_more_disk_space + @spec = setup_base_spec + FileUtils.rm @spec.spec_file + assert_path_not_exist @spec.spec_file + + @spec.files = %w[a.rb b.rb c.rb] + + installer = Gem::Installer.for_spec @spec + installer.gem_home = @gemhome + + File.class_eval do + alias_method :original_write, :write + + def write(data) + raise Errno::ENOSPC + end + end + + assert_raise Errno::ENOSPC do + installer.write_spec + end + + assert_path_not_exist @spec.spec_file + ensure + File.class_eval do + remove_method :write + alias_method :write, :original_write # rubocop:disable Lint/DuplicateMethods + remove_method :original_write + end + end + def test_dir installer = setup_base_installer -- cgit v1.2.3