Project

General

Profile

Bug #10685

Segfault from keyword rest arg when coercing an object that defines to_hash

Added by headius (Charles Nutter) over 2 years ago. Updated over 2 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
[ruby-core:67264]

Description

This spec appears to cause the segfault mentioned in http://rubini.us/2014/12/31/matz-s-ruby-developers-don-t-use-rubyspec/ today.

    it "calls #to_hash on the last element if keyword arguments are present" do
      obj = mock("destructure block keyword arguments")
      obj.should_receive(:to_hash).and_return({x: 9})

      result = m([1, 2, 3, obj]) { |a, *b, c, **k| [a, b, c, k] }
      result.should == [1, [2], 3, {x: 9}]
    end

I tried to boil it down to a shorter example and was not able to isolate it from RubySpec/mspec entanglement.

Here's the full dump including the last spec line that starts to run (the spec above): https://gist.github.com/headius/5d52df923eb615729ca3

I ran it using mspec gem from rubyspec's "archive" branch using "mspec ci -f s language".


Related issues

Has duplicate Ruby trunk - Bug #10695: Segmentation fault with *args and **kwargsClosed2015-01-04
Has duplicate Ruby trunk - Bug #10734: Segfault when combining default arguments with keyword argumentsClosed2015-01-12

Associated revisions

Revision 49089
Added by nobu (Nobuyoshi Nakada) over 2 years ago

vm_args.c: add ref r49088

  • vm_args.c (keyword_hash_p): fix non-symbol keys hash. rb_extract_keywords() returns 0 not Qnil when no symbol keys is included. [Bug #10685]

Revision 49089
Added by nobu (Nobuyoshi Nakada) over 2 years ago

vm_args.c: add ref r49088

  • vm_args.c (keyword_hash_p): fix non-symbol keys hash. rb_extract_keywords() returns 0 not Qnil when no symbol keys is included. [Bug #10685]

Revision 49089
Added by nobu (Nobuyoshi Nakada) over 2 years ago

vm_args.c: add ref r49088

  • vm_args.c (keyword_hash_p): fix non-symbol keys hash. rb_extract_keywords() returns 0 not Qnil when no symbol keys is included. [Bug #10685]

Revision 49272
Added by naruse (Yui NARUSE) over 2 years ago

merge revision(s) 49089: [Backport #10685]
included. [Bug #10685]

Revision 49273
Added by naruse (Yui NARUSE) over 2 years ago

merge revision(s) 49088: [Backport #10685]

* vm_args.c (keyword_hash_p): fix non-symbol keys hash.
  rb_extract_keywords() returns 0 not Qnil when no symbol keys is
  included.

History

#1 [ruby-core:67267] Updated by chrisseaton (Chris Seaton) over 2 years ago

I think this is the equivalent code extracted from MSpec. But I can't get this to crash on 2.2.0p0.

def m(a) yield a end

class Mock
  def to_hash
    puts 'to_hash called'
    {x: 9}
  end
end

obj = Mock.new

result = m([1, 2, 3, obj]) { |a, *b, c, **k| [a, b, c, k] }
p result#.should == [1, [2], 3, {x: 9}]
p result == [1, [2], 3, {x: 9}]

#2 [ruby-core:67269] Updated by normalperson (Eric Wong) over 2 years ago

Thanks for the report, looks like nobu committed a fix as r49088

This spec appears to cause the segfault mentioned in
http://rubini.us/2014/12/31/matz-s-ruby-developers-don-t-use-rubyspec/
today.

Fwiw, I do run "make test-rubyspec" before I commit,
but that's naruse's repo which I guess is different..

Like many projects nowadays, I won't bother contributing to rubyspec
because it requires an account on a proprietary service provider.
Free Software (e.g. Ruby) needs Free tools:
http://mako.cc/writing/hill-free_tools.html

#3 [ruby-core:67274] Updated by nobu (Nobuyoshi Nakada) over 2 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

Applied in changeset r49089.


vm_args.c: add ref r49088

  • vm_args.c (keyword_hash_p): fix non-symbol keys hash. rb_extract_keywords() returns 0 not Qnil when no symbol keys is included. [Bug #10685]

#4 [ruby-core:67276] Updated by nobu (Nobuyoshi Nakada) over 2 years ago

  • Description updated (diff)
  • Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED

#5 [ruby-core:67277] Updated by nobu (Nobuyoshi Nakada) over 2 years ago

Chris Seaton wrote:

I think this is the equivalent code extracted from MSpec. But I can't get this to crash on 2.2.0p0.

It's another failure, but false positive.

#6 [ruby-core:67330] Updated by nobu (Nobuyoshi Nakada) over 2 years ago

  • Has duplicate Bug #10695: Segmentation fault with *args and **kwargs added

#7 Updated by ktsj (Kazuki Tsujimoto) over 2 years ago

  • Has duplicate Bug #10734: Segfault when combining default arguments with keyword arguments added

#8 [ruby-core:67618] Updated by naruse (Yui NARUSE) over 2 years ago

  • Backport changed from 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: DONE

ruby_2_2 r49272 merged revision(s) 49089.

Also available in: Atom PDF