summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMartin Emde <martin.emde@gmail.com>2023-12-17 13:22:38 -0800
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2024-01-24 13:50:16 +0900
commit01f9766aa05182a7bbdc914a5dcd8a36ebade861 (patch)
treea93628420b1a39603f4be3bb31b83a45feb09d22 /lib
parent2defa9f4ae52c99e64a02b7f78362fbd788a1fd0 (diff)
Ensure File.open applies default umask on gem extract
Diffstat (limited to 'lib')
-rw-r--r--lib/rubygems/package.rb8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/rubygems/package.rb b/lib/rubygems/package.rb
index 387e40ffd7..7b4cab7964 100644
--- a/lib/rubygems/package.rb
+++ b/lib/rubygems/package.rb
@@ -448,13 +448,15 @@ EOM
end
unless directories.include?(mkdir)
- FileUtils.mkdir_p mkdir, mode: dir_mode ? 0o755 : (entry.header.mode if entry.directory?)
+ mkdir_mode = 0o755 if dir_mode
+ mkdir_mode ||= entry.header.mode if entry.directory?
+ mkdir_mode &= ~File.umask if mkdir_mode
+ FileUtils.mkdir_p mkdir, mode: mkdir_mode
directories << mkdir
end
if entry.file?
- File.open(destination, "wb") {|out| copy_stream(entry, out) }
- FileUtils.chmod file_mode(entry.header.mode), destination
+ File.open(destination, "wb", file_mode(entry.header.mode)) {|out| copy_stream(entry, out) }
end
verbose destination