Project

General

Profile

Actions

Bug #15650

closed

Segmentation fault when accessing $! in at_exit within a forked process

Added by vincentvanbush (Michał Buszkiewicz) over 3 years ago. Updated about 3 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-linux]
[ruby-core:91731]

Description

In the following piece of code, break is erroneously used inside a block passed to Process.fork, which would normally result in a ``fork': unexpected breakmessage. It is not entirely clear to me whether this should be accessible as an exception object or not - if not, I would expect this code to just print the error out and terminate, so $! would just containnil` in the `at_exit` block.

fork do
  at_exit do
    puts $!
  end

  break
end

However, what occurs is a segmentation fault, which can be found in an attachment to this issue.

Historical behavior:

  • ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]:
nil
foo.rb:7:in `fork': unexpected break
  • ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]:
foo.rb:3:in `block (2 levels) in <main>': method `method_missing' called on unexpected T_NODE object (0x0055a2323cfc88 flags=0x381c klass=0x0) (NotImplementedError)
        from foo.rb:1:in `fork'
        from foo.rb:1:in `<main>'
foo.rb:1:in `fork': unexpected break
  • ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux]:
foo.rb:3:in `puts': method `to_ary' called on unexpected T_NODE object (0x00565176a0f820 flags=0x391c) (NotImplementedError)
	from foo.rb:3:in `puts'
	from foo.rb:3:in `block (2 levels) in <main>'
	from foo.rb:1:in `fork'
	from foo.rb:1:in `<main>'
foo.rb:1: unexpected break
  • ruby 2.1.9p490 (2016-03-30 revision 54437) [x86_64-linux] - segmentation fault
  • ruby 2.2.10p489 (2018-03-28 revision 63023) [x86_64-linux] - ditto
  • ruby 2.3.8p459 (2018-10-18 revision 65136) [x86_64-linux] - ditto
  • ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-linux] - ditto
  • ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux] - ditto

There is clearly something funny going on since 1.9, and 2.1 goes totally nuts.

When break is replaced with raise 'foo', all of these versions catch the exception under $! correctly.

Tried compiling 2.6.1 under Ubuntu with GCC 4, 5, 6, 7 and 8, and Clang and the exception is not different. Also tried one of the rubies (2.3.8) compiled in CentOS 7 - no difference in result.


Files

backtrace.txt (17.3 KB) backtrace.txt Backtrace from Ruby 2.6.1 vincentvanbush (Michał Buszkiewicz), 03/09/2019 10:10 PM
Actions #1

Updated by vincentvanbush (Michał Buszkiewicz) over 3 years ago

  • Description updated (diff)
Actions #2

Updated by nobu (Nobuyoshi Nakada) over 3 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r67201.


eval.c: clear internal errinfo

Actions #3

Updated by nobu (Nobuyoshi Nakada) over 3 years ago

  • Backport changed from 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN to 2.4: REQUIRED, 2.5: REQUIRED, 2.6: REQUIRED
  • Description updated (diff)

Updated by naruse (Yui NARUSE) over 3 years ago

  • Backport changed from 2.4: REQUIRED, 2.5: REQUIRED, 2.6: REQUIRED to 2.4: REQUIRED, 2.5: REQUIRED, 2.6: DONE

ruby_2_6 r67209 merged revision(s) 67201.

Updated by nagachika (Tomoyuki Chikanaga) over 3 years ago

  • Backport changed from 2.4: REQUIRED, 2.5: REQUIRED, 2.6: DONE to 2.4: REQUIRED, 2.5: DONE, 2.6: DONE

ruby_2_5 r67233 merged revision(s) 67201.

Updated by usa (Usaku NAKAMURA) about 3 years ago

  • Backport changed from 2.4: REQUIRED, 2.5: DONE, 2.6: DONE to 2.4: DONE, 2.5: DONE, 2.6: DONE

ruby_2_4 r67392 merged revision(s) 67201.

Actions

Also available in: Atom PDF