Actions
Bug #21196
closedRuby 3.4 ignores visibility when passing arguments using `...`
Description
If method is passing arguments using ...
, then receiver visibility gets ignored if once called without receiver:
class A
private
def foo = :foo
def bar = :bar
end
class B
def initialize(o)
@o = o
end
def foo(...) = @o.foo(...)
def bar = @o.bar
def internal_foo = foo
def internal_bar = bar
end
def try
p yield
rescue => e
p e
end
If foo
is called first without receiver through internal_foo
:
b = B.new(A.new)
try{ b.internal_foo }
try{ b.internal_bar }
try{ b.foo }
try{ b.bar }
Visibility of A#foo
gets ignored:
ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux]
:foo
#<NoMethodError: private method 'bar' called for an instance of A>
:foo
#<NoMethodError: private method 'bar' called for an instance of A>
ruby 3.3.7 (2025-01-15 revision be31f993d7) [x86_64-linux]
#<NoMethodError: private method `foo' called for an instance of A>
#<NoMethodError: private method `bar' called for an instance of A>
#<NoMethodError: private method `foo' called for an instance of A>
#<NoMethodError: private method `bar' called for an instance of A>
If internal_foo
is not called before foo
:
b = B.new(A.new)
try{ b.foo }
try{ b.bar }
Visibility of A#foo
gets checked:
ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux]
#<NoMethodError: private method 'foo' called for an instance of A>
#<NoMethodError: private method 'bar' called for an instance of A>
ruby 3.3.7 (2025-01-15 revision be31f993d7) [x86_64-linux]
#<NoMethodError: private method `foo' called for an instance of A>
#<NoMethodError: private method `bar' called for an instance of A>
Updated by tenderlovemaking (Aaron Patterson) 6 days ago
- Assignee set to tenderlovemaking (Aaron Patterson)
- Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN to 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: REQUIRED
Updated by tenderlovemaking (Aaron Patterson) 6 days ago
I've sent a PR with a fix, but I can't seem to merge it right now. I will get it merged as soon as possible.
Updated by tenderlovemaking (Aaron Patterson) 6 days ago
- Status changed from Open to Closed
Applied in changeset git|595040ba271175e18c8461a926c34903742788de.
FCALL shouldn't be forwarded from caller
When we forward an FCALL (a method call with an implicit self), we
shouldn't forward the FCALL flag because it ignores method visibility
checks. This patch removes the FCALL flag from callers.
[Bug #21196]
Updated by tenderlovemaking (Aaron Patterson) about 23 hours ago
- Has duplicate Bug #21125: Kernel is called first added
Actions
Like1
Like0Like0Like1Like0