Skip to content

CompactIndexClient errors when a line doesn't have a checksum #9491

@jneen

Description

@jneen

If a line from the compact index looks like:

        b 2.0.0

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 ----------------------------------------------------------------

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions