From: zn@... Date: 2020-10-22T06:44:22+00:00 Subject: [ruby-core:100496] [Ruby master Bug#17254] ENV.replace may set nil instead of the proper value Issue #17254 has been updated by znz (Kazuhiro NISHIYAMA). I dump duplicated keys with encoding. Encodings of duplicated keys are same. ``` vagrant@buster:/tmp/t$ cat /tmp/dump2.rb class << ENV alias orig_replace replace def replace(h) key_count = ENV.keys.tally duplicated_keys = [] ENV.each_pair.each do |k, v| next if key_count[k] == 1 duplicated_keys << k puts "#{k.dump}(#{k.encoding})=#{v.dump}" end puts duplicated_keys.uniq.each do |k| puts "#{k.dump}(#{k.encoding})=#{ENV[k].dump}" end puts orig_replace(h) end end vagrant@buster:/tmp/t$ env PATH=/var/www/docs.ruby-lang.org/shared/bundle/ruby/2.7.0/bin:/snap/bin:$PATH DEBIAN_DISABLE_RUBYGEMS_INTEGRATION=1 bundle exec env -u RUBYOPT ruby -r/tmp/dump2 -r/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib/bundler/setup -e 'p ENV["RUBYLIB"]' "GEM_HOME"(UTF-8)="/home/vagrant/.gem" "RUBYLIB"(UTF-8)="/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib:/snap/ruby/189/lib/ruby/2.7.0:/snap/ruby/189/lib/ruby/2.7.0/amd64" "GEM_PATH"(UTF-8)="/home/vagrant/.gem:/snap/ruby/189/lib/ruby/gems/2.7.0" "GEM_HOME"(UTF-8)="/home/vagrant/.gem" "GEM_PATH"(UTF-8)="/home/vagrant/.gem:/snap/ruby/189/lib/ruby/gems/2.7.0" "RUBYLIB"(UTF-8)="/snap/ruby/189/lib/ruby/2.7.0:/snap/ruby/189/lib/ruby/2.7.0/amd64:/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib:/snap/ruby/189/lib/ruby/2.7.0:/snap/ruby/189/lib/ruby/2.7.0/amd64" "GEM_HOME"(UTF-8)="/home/vagrant/.gem" "RUBYLIB"(UTF-8)="/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib:/snap/ruby/189/lib/ruby/2.7.0:/snap/ruby/189/lib/ruby/2.7.0/amd64" "GEM_PATH"(UTF-8)="/home/vagrant/.gem:/snap/ruby/189/lib/ruby/gems/2.7.0" "/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib" ``` ---------------------------------------- Bug #17254: ENV.replace may set nil instead of the proper value https://bugs.ruby-lang.org/issues/17254#change-88115 * Author: znz (Kazuhiro NISHIYAMA) * Status: Open * Priority: Normal * ruby -v: ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- On docs.ruby-lang.org, it uses [snap ruby](https://snapcraft.io/ruby), and it failed to run `rdoc`. ``` Oct 07 13:20:08 docs-2020.ruby-lang.org env[6183]: rdoc --title Documentation for Ruby master --main README.md --output /var/www/docs.ruby-lang.org/releases/20200916140300/master -U --all --encoding=UTF-8 . Oct 07 13:20:08 docs-2020.ruby-lang.org env[6183]: :1:in `require': cannot load such file -- rubygems.rb (LoadError) Oct 07 13:20:08 docs-2020.ruby-lang.org env[6183]: from :1:in `' Oct 07 13:20:08 docs-2020.ruby-lang.org env[6183]: rake aborted! ``` I investigate it, it caused by setting nil instead of the proper value in `ENV.replace`. ``` vagrant@buster:/tmp/t$ cat Gemfile # frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } # gem "rails" vagrant@buster:/tmp/t$ env PATH=/var/www/docs.ruby-lang.org/shared/bundle/ruby/2.7.0/bin:/snap/bin:$PATH DEBIAN_DISABLE_RUBYGEMS_INTEGRATION=1 bundle exec env -u RUBYOPT ruby -r/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib/bundler/setup -e 'p ENV["RUBYLIB"]' "/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib" ``` Calling `ENV.clear` before `ENV.replace` resolves this issue. ``` vagrant@buster:/tmp/t$ cat /tmp/clear-before-replace.rb class << ENV alias orig_replace replace def replace(h) clear orig_replace(h) end end vagrant@buster:/tmp/t$ env PATH=/var/www/docs.ruby-lang.org/shared/bundle/ruby/2.7.0/bin:/snap/bin:$PATH DEBIAN_DISABLE_RUBYGEMS_INTEGRATION=1 bundle exec env -u RUBYOPT ruby -r/tmp/clear-before-replace -r/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib/bundler/setup -e 'p ENV["RUBYLIB"]' "/snap/ruby/189/lib/ruby/gems/2.7.0/gems/bundler-2.1.4/lib:/snap/ruby/189/lib/ruby/2.7.0:/snap/ruby/189/lib/ruby/2.7.0/amd64" ``` Where should call `ENV.clear`? In `ENV.replace` or caller of `ENV.replace`? ---Files-------------------------------- full-env-log.txt (8.96 KB) rdoc-failed-log.txt (2.57 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: