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