diff options
author | Koichi Sasada <ko1@atdot.net> | 2019-11-12 04:33:28 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2019-11-12 04:33:28 +0900 |
commit | b8d242d221641752a495ca43f8f211a3ad73d467 (patch) | |
tree | c70ec2fd51a0ea08b8004700af2f44fa4fc375f1 /lib/rubygems | |
parent | 4be1e84d7894751799cc9d8ae2dec720952a02a3 (diff) | |
download | ruby-b8d242d221641752a495ca43f8f211a3ad73d467.tar.gz |
release RUBYGEMS_ACTIVATION_MONITOR correctly.
`File.symlink? safe_lp` can raise SecurityError and raising an
exception can leave RUBYGEMS_ACTIVATION_MONITOR locking. This
patch release it correctly.
Diffstat (limited to 'lib/rubygems')
-rw-r--r-- | lib/rubygems/core_ext/kernel_require.rb | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb index 88b1bd9cd6..944bb93bb6 100644 --- a/lib/rubygems/core_ext/kernel_require.rb +++ b/lib/rubygems/core_ext/kernel_require.rb @@ -42,7 +42,15 @@ module Kernel rp = nil $LOAD_PATH[0...Gem.load_path_insert_index || -1].each do |lp| safe_lp = lp.dup.tap(&Gem::UNTAINT) - next if File.symlink? safe_lp # for backword compatibility + begin + if File.symlink? safe_lp # for backword compatibility + next + end + rescue SecurityError + RUBYGEMS_ACTIVATION_MONITOR.exit + raise + end + Gem.suffixes.each do |s| full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}")) if File.file?(full_path) @@ -159,7 +167,7 @@ module Kernel raise load_error ensure if RUBYGEMS_ACTIVATION_MONITOR.mon_owned? - STDERR.puts [$!, $!.backtrace].inspect + STDERR.puts [$$, Thread.current, $!, $!.backtrace].inspect if $! raise "CRITICAL: RUBYGEMS_ACTIVATION_MONITOR is holding." end end |