aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDavid Rodríguez <deivid.rodriguez@riseup.net>2024-01-12 14:53:40 +0100
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2024-01-19 11:28:11 +0900
commitdb44088c2a92040879386aa5f268db4c858e4e5b (patch)
treed7518e3cf9a9ea381f2c8b06ce859a4293c8c7d0 /lib
parentf1f5f22d22a149f20e019728b1ab35593d29d81a (diff)
downloadruby-db44088c2a92040879386aa5f268db4c858e4e5b.tar.gz
[rubygems/rubygems] Fix activation conflicts when circularly requiring a gem
If a gem is required circular, and there are unresolved specs depending on it, we may end up in an activation conflict. The solution is to not try to activate unresolved gems when requiring a default gem, regardless of it having already been activated or not. https://github.com/rubygems/rubygems/commit/3b2b8f4e3e
Diffstat (limited to 'lib')
-rw-r--r--lib/rubygems.rb7
-rw-r--r--lib/rubygems/core_ext/kernel_require.rb8
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index 47b1ce69d2..ad7ab10756 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -1216,6 +1216,13 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
##
# Find a Gem::Specification of default gem from +path+
+ def find_default_spec(path)
+ @path_to_default_spec_map[path]
+ end
+
+ ##
+ # Find an unresolved Gem::Specification of default gem from +path+
+
def find_unresolved_default_spec(path)
default_spec = @path_to_default_spec_map[path]
default_spec if default_spec && loaded_specs[default_spec.name] != default_spec
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 50e3ea89b4..073966b696 100644
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -42,7 +42,11 @@ module Kernel
# If +path+ belongs to a default gem, we activate it and then go straight
# to normal require
- if spec = Gem.find_unresolved_default_spec(path)
+ if spec = Gem.find_default_spec(path)
+ name = spec.name
+
+ next if Gem.loaded_specs[name]
+
# Ensure -I beats a default gem
resolved_path = begin
rp = nil
@@ -60,7 +64,7 @@ module Kernel
rp
end
- Kernel.send(:gem, spec.name, Gem::Requirement.default_prerelease) unless
+ Kernel.send(:gem, name, Gem::Requirement.default_prerelease) unless
resolved_path
next