From: "hsbt (Hiroshi SHIBATA)" Date: 2021-11-30T08:01:56+00:00 Subject: [ruby-core:106335] [Ruby master Bug#18355] require("pathname") within rack application chnages behaviors of Pathname methods, such as absolute?(), when there are two versions of 'pathname' gem installed. Issue #18355 has been updated by hsbt (Hiroshi SHIBATA). Assignee set to hsbt (Hiroshi SHIBATA) Status changed from Open to Assigned ---------------------------------------- Bug #18355: require("pathname") within rack application chnages behaviors of Pathname methods, such as absolute?(), when there are two versions of 'pathname' gem installed. https://bugs.ruby-lang.org/issues/18355#change-94972 * Author: ume-san (Toshi Umehara) * Status: Assigned * Priority: Normal * Assignee: hsbt (Hiroshi SHIBATA) * ruby -v: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- ## 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-------------------------------- segmentation_fault.txt (51.1 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: