Project

General

Profile

Actions

Bug #21196

closed

Ruby 3.4 ignores visibility when passing arguments using `...`

Added by toy (Ivan Kuchin) 6 days ago. Updated 6 days ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux]
[ruby-core:121429]

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>

Related issues 1 (0 open1 closed)

Has duplicate Ruby - Bug #21125: Kernel is called firstClosedtenderlovemaking (Aaron Patterson)Actions

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.

Actions #3

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]

Actions #4

Updated by tenderlovemaking (Aaron Patterson) about 23 hours ago

  • Has duplicate Bug #21125: Kernel is called first added
Actions

Also available in: Atom PDF

Like1
Like0Like0Like1Like0