-
- Notifications
You must be signed in to change notification settings - Fork 1.9k
Open
Labels
Description
Describe the problem as clearly as you can
The SafeMarshal feature of Rubygems >= 4.0.0 causes memory exhaustion on AIX 7.2 when adding sources.
With Rubygems 4.0.3 on Ruby 4.0.1:
[0] [AIX] root@aix72-2-pix:~ # /opt/puppetlabs/puppet/bin/gem source --add $internal_artifactory_repo [FATAL] failed to allocate memoryDid you try upgrading RubyGems?
This issue also seems to affect RubyGems upgrades:
[0] [AIX] root@aix72-2-pix:~ # /opt/puppetlabs/puppet/bin/gem update --system [FATAL] failed to allocate memoryPost steps to reproduce the problem
The simplest reproduction is to take an AIX 7.2 machine and attempt to gem source --add.
@joshcooper also created this reproduction script:
require 'rubygems' require 'rubygems/safe_marshal' require 'objspace' def safe_marshal_element_classes result = [] Gem::SafeMarshal::Elements.constants(false).each do |const| c = Gem::SafeMarshal::Elements.const_get(const) result << c if c.is_a?(Class) rescue NameError # ignore end result end def histogram_counts(limit: 50, min_count: 1) klasses = safe_marshal_element_classes counts = klasses.map do |k| n = 0 ObjectSpace.each_object(k) { n += 1 } [k, n] end counts.select! { |(_, n)| n >= min_count } counts.sort_by! { |(_, n)| -n } counts.first(limit) end io = Gem.read_binary(ARGV[0]) data = Gem::SafeMarshal.safe_load(io) #tuples = Gem::NameTuple.from_list(rval) histogram_counts(limit: 25).each do |klass, n| puts "#{klass}: #{n}" endEven when attempting to load specs from rubygems.org, we see the same issue:
[0] [AIX] root@aix72-2-pix:~ # curl -s --output rubygems-specs.4.8.gz https://rubygems.org/specs.4.8.gz [0] [AIX] root@aix72-2-pix:~ # gunzip rubygems-specs.4.8.gz [0] [AIX] root@aix72-2-pix:~ # /opt/puppetlabs/puppet/bin/ruby spec_histogram.rb rubygems-specs.4.8 [FATAL] failed to allocate memoryWhich command did you run?
gem source --addWhat were you expecting to happen?
Rubygems adds another source for gems.
What actually happened?
The command failed with [FATAL] failed to allocate memory.
Run gem env and paste the output below
[0] [AIX] root@aix72-2-pix:~ # /opt/puppetlabs/puppet/bin/gem env RubyGems Environment: - RUBYGEMS VERSION: 4.0.3 - RUBY VERSION: 4.0.1 (2026-01-13 patchlevel 0) [powerpc-aix7.2.0.0] - INSTALLATION DIRECTORY: /opt/puppetlabs/puppet/lib/ruby/gems/4.0.0 - USER INSTALLATION DIRECTORY: /root/.local/share/gem/ruby/4.0.0 - CREDENTIALS FILE: /root/.local/share/gem/credentials - RUBY EXECUTABLE: /opt/puppetlabs/puppet/bin/ruby - GIT EXECUTABLE: - EXECUTABLE DIRECTORY: /opt/puppetlabs/puppet/bin - SPEC CACHE DIRECTORY: /root/.cache/gem/specs - SYSTEM CONFIGURATION DIRECTORY: /opt/puppetlabs/puppet/etc - RUBYGEMS PLATFORMS: - ruby - powerpc-aix-7 - GEM PATHS: - /opt/puppetlabs/puppet/lib/ruby/gems/4.0.0 - /root/.local/share/gem/ruby/4.0.0 - /opt/puppetlabs/puppet/lib/ruby/vendor_gems - GEM CONFIGURATION: - :update_sources => true - :verbose => true - :backtrace => true - :bulk_threshold => 1000 - REMOTE SOURCES: - https://rubygems.org/ - SHELL PATH: - - - /usr/bin - /etc - /usr/sbinReactions are currently unavailable