Index: lib/rubygems.rb =================================================================== --- lib/rubygems.rb (revision 32241) +++ lib/rubygems.rb (working copy) @@ -452,11 +452,15 @@ def self.ensure_gem_subdirectories dir = Gem.dir require 'fileutils' + old_umask = File.umask + File.umask(old_umask | 022) %w[cache doc gems specifications].each do |name| subdir = File.join dir, name next if File.exist? subdir FileUtils.mkdir_p subdir rescue nil # in case of perms issues -- lame end + ensure + File.umask(old_umask) end ## Index: test/rubygems/test_gem.rb =================================================================== --- test/rubygems/test_gem.rb (revision 32241) +++ test/rubygems/test_gem.rb (working copy) @@ -604,6 +604,20 @@ assert File.directory? File.join(@gemhome, "cache") end + def test_self_ensure_gem_directories_safe_permissions + FileUtils.rm_r @gemhome + Gem.use_paths @gemhome + + old_umask = File.umask + File.umask(0) + Gem.ensure_gem_subdirectories @gemhome + + assert_equal 0, File::Stat.new(@gemhome).mode & 022 + assert_equal 0, File::Stat.new(File.join(@gemhome, "cache")).mode & 022 + ensure + File.umask(old_umask) + end + def test_self_ensure_gem_directories_missing_parents gemdir = File.join @tempdir, 'a/b/c/gemdir' FileUtils.rm_rf File.join(@tempdir, 'a') rescue nil