Project

General

Profile

Bug #21125

Updated by mikik0 (Hashino Mikiko) 13 days ago

Kernel#system is being called when there is a column or method name named system. 
 The other methods of Kernel reproduce the problem. 
 Ex.Rand returns a random value, and exit terminates the program. 

 This problem did not occur until Ruby 3.3 series, but has occurred since Ruby 3.4. 

 ## Reproducible script: 

 ``` ruby 
 class ObjectifiedHash 
   def initialize(hash) 
     @hash = hash 
   end 

   private 

   attr_reader :hash 

   def method_missing(method_name, *args, &block) 
     if hash.key?(method_name.to_sym) 
       hash[method_name.to_sym] 
     else 
       super 
     end 
   end 

   def respond_to_missing?(method_name, include_private = false) 
     hash.key?(method_name.to_sym) || super 
   end 
 end 

 class Foo 
   def system(...) 
     # Kernel#system is called 
     raw.system(...) 
     # (...) passes if there is no 
     # raw.system 
   end 

   def initialize(raw) 
     @raw = raw 
   end 

   def get_system 
     system 
   end 

   private 

   attr_reader :raw 
 end 

 class Test 
   def self.run 
     obj = ObjectifiedHash.new({ 
       system: 'system' 
     }) 

     foo = Foo.new(obj) 
     # foo.system would pass. 
     # After executing foo.system, hoge.get_system also passes. 
     # p foo.system 
     p foo.get_system 
   end 
 end 

 Test.run 

 ``` 

 ## Execution Results 
 ``` shell 
 hoge.rb:26:in 'Kernel#system': wrong number of arguments (given 0, expected 1+) (ArgumentError) 

     raw.system(...) 
                ^^^ 
         from ruby.rb:26:in 'Foo#system' 
         from ruby.rb:36:in 'Foo#get_system' 
         from ruby.rb:54:in 'Test.run' 
         from ruby.rb:58:in '<main>' 
 ``` 

 ## Expected results 
 ``` shell 
 "system" 
 ``` 

 PR that may be relevant: https://github.com/ruby/ruby/pull/11028

Back