Bug #18355
closedrequire("pathname") within rack application chnages behaviors of Pathname methods, such as absolute?(), when there are two versions of 'pathname' gem installed.
Description
Environment¶
Ruby 3.0.2 is installed on Fedora 34 from source.
'gem update' is conducted, and there are two versions of 'pathname' gems (0.2.0, default: 0.1.0) installed as follows.
> uname -a Linux localhost.localdomain 5.14.18-200.fc34.x86_64 #1 SMP Fri Nov 12 16:48:10 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux > ruby -v ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux] > gem update --system > gem update > gem list ... pathname (0.2.0, default: 0.1.0) ... Code¶
The following files, Gemfile and config.ru, are placed in the same directory.
# Gemfile source 'https://rubygems.org/' gem 'rack' gem 'webrick' # config.ru class Application def call(env) status = 200 headers = { "Content-Type" => "text/html" } path = Dir.pwd() pathname1 = Pathname.new(path) require("pathname") pathname2 = Pathname.new(path) body = ["#{pathname1.absolute?} #{pathname2.absolute?}"] [status, headers, body] end end run Application.new Command¶
Web server starts using the following commands.
bundle config set --local path 'vendor/bundle' bundle install bundle exec rackup -s webrick - Output on the console
[2021-11-21 09:44:13] INFO WEBrick 1.7.0 [2021-11-21 09:44:13] INFO ruby 3.0.2 (2021-07-07) [x86_64-linux] [2021-11-21 09:44:13] INFO WEBrick::HTTPServer#start: pid=2770 port=9292 Expected Result¶
Accessing localhost:9292 using a web browser , 'true true' is an expected result on the browser, because pathname1 and pathanme2 are generated from the same absolute path in the above code.
true true Actual Result¶
Accessing localhost:9292 shows the following messages on the browser and the console. After 'require("pathname")', Pathname.absolute?() retuns false, even if represents an absolute path.
- On the browser
true false - On the console
/home/toshihiro/Ruby3/lib/ruby/3.0.0/pathname.rb:20: warning: already initialized constant Pathname::TO_PATH /home/toshihiro/Ruby3/lib/ruby/gems/3.0.0/gems/pathname-0.2.0/lib/pathname.rb:20: warning: previous definition of TO_PATH was here /home/toshihiro/Ruby3/lib/ruby/3.0.0/pathname.rb:22: warning: already initialized constant Pathname::SAME_PATHS /home/toshihiro/Ruby3/lib/ruby/gems/3.0.0/gems/pathname-0.2.0/lib/pathname.rb:22: warning: previous definition of SAME_PATHS was here /home/toshihiro/Ruby3/lib/ruby/3.0.0/pathname.rb:34: warning: already initialized constant Pathname::SEPARATOR_LIST /home/toshihiro/Ruby3/lib/ruby/gems/3.0.0/gems/pathname-0.2.0/lib/pathname.rb:34: warning: previous definition of SEPARATOR_LIST was here /home/toshihiro/Ruby3/lib/ruby/3.0.0/pathname.rb:35: warning: already initialized constant Pathname::SEPARATOR_PAT /home/toshihiro/Ruby3/lib/ruby/gems/3.0.0/gems/pathname-0.2.0/lib/pathname.rb:35: warning: previous definition of SEPARATOR_PAT was here /home/toshihiro/Ruby3/lib/ruby/3.0.0/pathname.rb:41: warning: already initialized constant Pathname::ABSOLUTE_PATH /home/toshihiro/Ruby3/lib/ruby/gems/3.0.0/gems/pathname-0.2.0/lib/pathname.rb:41: warning: previous definition of ABSOLUTE_PATH was here 127.0.0.1 - - [21/Nov/2021:09:44:20 +0900] "GET / HTTP/1.1" 200 10 0.0339 Segmentation fault¶
Moreover, press Ctrl-c to stop the Rack application, the application causes a segmentation fault.
The segmentation fault message is attached.
Notes¶
Uninstalling version 0.2.0 of pathname gem solves the problem above. Therefore, I guess having two versions of pathname gems causes this behavior.
gem uninstall pathname --version=0.2.0 - Start the Rack application again
bundle exec rackup -s webrick - Output on the browser
The expected output is obtained on the browser, without warning messages on the console.
true true Files
Updated by hsbt (Hiroshi SHIBATA) almost 4 years ago
- Status changed from Open to Assigned
- Assignee set to hsbt (Hiroshi SHIBATA)
Updated by hsbt (Hiroshi SHIBATA) almost 3 years ago
- Status changed from Assigned to Feedback
Can you try it with the latest version of RubyGems/Bundler?
You can do it with:
$ gem update --system