Project

General

Profile

Actions

Bug #13776

closed

Refined methods ignore visibility of inherited methods

Added by Mon_Ouie (Mon ouïe) about 5 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0dev (2017-07-28 trunk 59438) [x86_64-linux]
[ruby-core:82209]

Description

This bug was pointed out by al2o3-cr on the #ruby IRC channel on freenode. The following code sleeps for 3 seconds, even though String#sleep is a private method.

module Test
  refine String do
    def sleep; end
  end
end

puts "start"
"".sleep 3
puts "end"

This happens because vm_call_method_each_type, when running a method of type VM_METHOD_TYPE_REFINED, uses vm_call_zsuper to call inherited methods, which does not check the visibility of the method and directly executes it. I attached a patch which changes this code path and uses vm_call_method to trigger the code that honors method visibilities. I have not played extensively with this patch, but it at least does not seem to break any existing unit tests.


Files

refinement.patch (1.74 KB) refinement.patch Mon_Ouie (Mon ouïe), 07/29/2017 09:18 AM
Actions

Also available in: Atom PDF