Bug 1602877 - rh-ruby25-ruby - Trace on non existent home directory
Summary: rh-ruby25-ruby - Trace on non existent home directory
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Red Hat Software Collections
Classification: Red Hat
Component: ruby
Version: rh-ruby25
Hardware: All
OS: Linux
unspecified
medium
Target Milestone: ---
: 3.3
Assignee: Pavel Valena
QA Contact: David Jež
URL:
Whiteboard:
Depends On: 1563076 1650588
Blocks:
TreeView+ depends on / blocked
 
Reported: 2018-07-18 17:22 UTC by Pavel Valena
Modified: 2020-09-29 08:20 UTC (History)
5 users (show)

Fixed In Version: rh-ruby25-ruby-2.5.3-6.el7
Doc Type: If docs needed, set a value
Doc Text:
Clone Of: 1601934
Environment:
Last Closed: 2020-09-29 08:20:06 UTC
Target Upstream Version:
Embargoed:


Attachments (Terms of Use)

Description Pavel Valena 2018-07-18 17:22:33 UTC
+++ This bug was initially created as a clone of Bug #1601934 +++

Description of problem:
If the home directory for the current user does not exist ruby fails to run and produces a trace after trying to concatenate the empty string for the home directory to the gam_path.

Version-Release number of selected component (if applicable):
ruby-2.0.0.648-33.el7_4

How reproducible:
Always

Steps to Reproduce:
1. Create a user with a non existent home directory

# useradd -M -d /nodir alice

2. Run ruby as the above user

# su - alice
Last login: Tue Jul 17 13:04:17 BST 2018 on pts/1
su: warning: cannot change directory to /nodir: No such file or directory

-bash-4.2$ ruby

Actual results:

-bash-4.2$ ruby
/usr/share/rubygems/rubygems/path_support.rb:68:in `path=': undefined method `+' for nil:NilClass (NoMethodError)
	from /usr/share/rubygems/rubygems/path_support.rb:30:in `initialize'
	from /usr/share/rubygems/rubygems.rb:357:in `new'
	from /usr/share/rubygems/rubygems.rb:357:in `paths'
	from /usr/share/rubygems/rubygems.rb:379:in `path'
	from /usr/share/rubygems/rubygems/specification.rb:796:in `dirs'
	from /usr/share/rubygems/rubygems/specification.rb:660:in `each_normal'
	from /usr/share/rubygems/rubygems/specification.rb:671:in `_all'
	from /usr/share/rubygems/rubygems/specification.rb:824:in `each'
	from /usr/share/rubygems/rubygems/specification.rb:866:in `find'
	from /usr/share/rubygems/rubygems/specification.rb:866:in `find_inactive_by_path'
	from /usr/share/rubygems/rubygems.rb:175:in `try_activate'
	from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:132:in `rescue in require'
	from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:144:in `require'
	from <internal:abrt_prelude>:2:in `<compiled>'
-bash-4.2$ 

Ruby is failing to concatenate a nil string (the non existent home directory) to the gem_path:

/usr/share/rubygems/rubygems/path_support.rb
     42   ##
     43   # Set the Gem search path (as reported by Gem.path).
     44 
     45   def path=(gpaths)
     46     # FIX: it should be [home, *path], not [*path, home]
     47 
     48     gem_path = []

     67     else
     68       gem_path = Gem.default_path + [@home]

Appending "nil" to gem_path should never happen.

Expected results:

No trace is displayed, ruby waits for input on standard input.
Possibly a check prevents appending @home to gem_path if the former is nil.

Additional info:

This is also present in current version 2.5.1p57 (2018-03-29 revision 63029) (ruby-2.5.1-93.fc28)

--- Additional comment from Pavel Valena on 2018-07-18 10:10:26 EDT ---

Hello Julio,

thank you for you report. I can confirm this is an issue. The cause is however different.

/usr/share/rubygems/rubygems/path_support.rb
    67      else
    68        gem_path = Gem.default_path + [@home]
    69

Here `Gem.default_path` is `nil`, because it is overriden, based on our implementation of `operating_system.rb`.

/usr/share/rubygems/rubygems/defaults/operating_system.rb
    67      def default_path
    68        path = default_dirs.collect {|location, paths| paths[:gem_dir]}
    69        path.unshift Gem.user_dir if File.exist? Gem.user_home
    70      end

The method DOES NOT return `path` in case `Gem.user_home` is nonexistent.

It can be easily fixed by adding one line:
    67      def default_path
    68        path = default_dirs.collect {|location, paths| paths[:gem_dir]}
    69        path.unshift Gem.user_dir if File.exist? Gem.user_home
    70        path
    71      end

This unfortunately also affects all Red Hat Software Collections' Ruby packages.

Comment 5 Honza Horak 2020-07-02 13:18:15 UTC
This bug is a weird state -- is it still an issue or can this be closed?

Comment 6 Honza Horak 2020-09-23 07:49:08 UTC
(In reply to Honza Horak from comment #5)
> This bug is a weird state -- is it still an issue or can this be closed?

Ping?


Note You need to log in before you can comment on or make changes to this bug.