If a line from the compact index looks like:
then CompactIndexClient::Parser explodes. It looks like it was intended to be defensive against this case, but the final +1 on the line seems to have been added before the nil check, in a way the tests didn't catch:
# compact_index_client/parser.rb:74
return unless (checksum_start = line.index(" ", name_end + 1) + 1)
Error report template from bundle install:
--- ERROR REPORT TEMPLATE -------------------------------------------------------
NoMethodError: undefined method `+' for nil
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/compact_index_client/parser.rb:75:in `parse_version_checksum'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/compact_index_client/parser.rb:55:in `block in info_checksums'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/compact_index_client/parser.rb:54:in `each'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/compact_index_client/parser.rb:54:in `each_with_object'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/compact_index_client/parser.rb:54:in `info_checksums'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/compact_index_client/parser.rb:48:in `available?'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/compact_index_client.rb:84:in `available?'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/fetcher/compact_index.rb:55:in `available?'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/fetcher/compact_index.rb:13:in `bind_call'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/fetcher/compact_index.rb:13:in `block in compact_index_request'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/fetcher.rb:270:in `block in fetchers'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/fetcher.rb:270:in `drop_while'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/fetcher.rb:270:in `fetchers'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/fetcher.rb:243:in `api_fetcher?'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/source/rubygems.rb:396:in `select'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/source/rubygems.rb:396:in `api_fetchers'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/source/rubygems.rb:401:in `block in remote_specs'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/index.rb:9:in `build'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/source/rubygems.rb:400:in `remote_specs'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/source/rubygems.rb:147:in `specs'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/lazy_specification.rb:225:in `materialize'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/lazy_specification.rb:141:in `materialize_for_installation'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/lazy_specification.rb:132:in `materialized_for_installation'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/match_platform.rb:20:in `each'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/match_platform.rb:20:in `filter_map'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/match_platform.rb:20:in `select_best_local_platform_match'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/materialization.rb:27:in `specs'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/materialization.rb:18:in `complete?'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/spec_set.rb:260:in `block in materialize_dependencies'
<internal:kernel>:187:in `loop'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/spec_set.rb:246:in `materialize_dependencies'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/spec_set.rb:126:in `materialize'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/definition.rb:668:in `materialize'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/definition.rb:240:in `specs'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/installer.rb:222:in `ensure_specs_are_compatible!'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/installer.rb:75:in `block in run'
/usr/lib/ruby/vendor_ruby/rubygems.rb:835:in `block in open_file_with_flock'
/usr/lib/ruby/vendor_ruby/rubygems.rb:823:in `open'
/usr/lib/ruby/vendor_ruby/rubygems.rb:823:in `open_file_with_flock'
/usr/lib/ruby/vendor_ruby/rubygems.rb:809:in `open_file_with_lock'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/process_lock.rb:13:in `block in lock'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/shared_helpers.rb:106:in `filesystem_access'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/process_lock.rb:12:in `lock'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/installer.rb:65:in `run'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/installer.rb:17:in `install'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/cli/install.rb:50:in `run'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/cli.rb:291:in `block in install'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/settings.rb:143:in `temporary'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/cli.rb:290:in `install'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/cli.rb:35:in `dispatch'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/cli.rb:29:in `start'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/exe/bundle:28:in `block in <top (required)>'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/lib/bundler/friendly_errors.rb:118:in `with_friendly_errors'
/home/qcc-util/dns/vendor/bundle/ruby/3.3.0/gems/bundler-4.0.6/exe/bundle:20:in `<top (required)>'
/usr/bin/bundle:25:in `load'
/usr/bin/bundle:25:in `<main>'
Environment
Bundler 4.0.6
Platforms ruby, x86_64-linux-gnu
Ruby 3.3.8p144 (2025-04-09 revision b200bad6cd40d08e9f33b93e1a85c270b337867c) [x86_64-linux-gnu]
Full Path /usr/bin/ruby3.3
Config Dir /etc
RubyGems 3.6.7
Gem Home /home/qcc-util/dns/vendor/bundle/ruby/3.3.0
Gem Path /home/qcc-util/dns/vendor/bundle/ruby/3.3.0
User Home /home/qcc-util
User Path /home/qcc-util/.local/share/gem/ruby/3.3.0
Bin Dir /home/qcc-util/dns/vendor/bundle/ruby/3.3.0/bin
OpenSSL
Compiled OpenSSL 3.5.0 8 Apr 2025
Loaded OpenSSL 3.5.5 27 Jan 2026
Cert File /usr/lib/ssl/cert.pem
Cert Dir /usr/lib/ssl/certs
Tools
Git 2.47.3
RVM not installed
rbenv not installed
chruby not installed
Gem.ruby /usr/bin/ruby3.3
bundle #! /usr/bin/ruby
Bundler Build Metadata
Timestamp 2026-02-05
Git SHA 0947d9cf5b
Bundler settings
deployment
Set for your local app (/home/qcc-util/dns/.bundle/config): true
set
Set for your local app (/home/qcc-util/dns/.bundle/config): "deployment true"
Gemfile
Gemfile
# use cooldown gem repository
source 'https://beta.gem.coop/cooldown'
gem 'lunanode'
gem 'dns-zone', require: 'dns/zone'
gem 'pry'
Gemfile.lock
GEM
remote: https://beta.gem.coop/cooldown/
specs:
coderay (1.1.3)
dns-zone (0.3.1)
domain_name (0.6.20240107)
http-accept (1.7.0)
http-cookie (1.0.8)
domain_name (~> 0.5)
io-console (0.8.2)
logger (1.7.0)
lunanode (0.3.1)
rest-client (~> 2.0)
method_source (1.1.0)
mime-types (3.6.0)
logger
mime-types-data (~> 3.2015)
mime-types-data (3.2025.0220)
netrc (0.11.0)
pry (0.16.0)
coderay (~> 1.1)
method_source (~> 1.0)
reline (>= 0.6.0)
reline (0.6.3)
io-console (~> 0.5)
rest-client (2.1.0)
http-accept (>= 1.7.0, < 2.0)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
PLATFORMS
arm64-darwin-25
ruby
DEPENDENCIES
dns-zone
lunanode
pry
CHECKSUMS
coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
dns-zone (0.3.1) sha256=358176beaf21d97d51ba8451106b49f96030bce22d5ef2d4560df39c714e5b92
domain_name (0.6.20240107) sha256=5f693b2215708476517479bf2b3802e49068ad82167bcd2286f899536a17d933
http-accept (1.7.0) sha256=c626860682bfbb3b46462f8c39cd470fd7b0584f61b3cc9df5b2e9eb9972a126
http-cookie (1.0.8) sha256=b14fe0445cf24bf9ae098633e9b8d42e4c07c3c1f700672b09fbfe32ffd41aa6
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
lunanode (0.3.1) sha256=ca53fb1c2578794ac65faaad2e361a6b00d5b585461cfe485551d48d68af50a1
method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
mime-types (3.6.0) sha256=6f71db957840ceae44211531eff3e2f7e0dd4645fefb5f535dbaeb6307ab6464
mime-types-data (3.2025.0220) sha256=ec9189e38050dce1b6e726d68fd910cf121de36bdb723b04d4d3a83324fea4e0
netrc (0.11.0) sha256=de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f
pry (0.16.0) sha256=d76c69065698ed1f85e717bd33d7942c38a50868f6b0673c636192b3d1b6054e
reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
rest-client (2.1.0) sha256=35a6400bdb14fae28596618e312776c158f7ebbb0ccad752ff4fa142bf2747e3
BUNDLED WITH
4.0.6
--- TEMPLATE END ----------------------------------------------------------------
If a line from the compact index looks like:
then CompactIndexClient::Parser explodes. It looks like it was intended to be defensive against this case, but the final
+1on the line seems to have been added before the nil check, in a way the tests didn't catch:Error report template from
bundle install:--- ERROR REPORT TEMPLATE -------------------------------------------------------
Environment
Bundler Build Metadata
Bundler settings
Gemfile
Gemfile
Gemfile.lock
--- TEMPLATE END ----------------------------------------------------------------