[#53944] [ruby-trunk - Bug #8210][Open] Multibyte character interfering with end-line character within a regex — "sawa (Tsuyoshi Sawada)" <sawadatsuyoshi@...>

14 messages 2013/04/03

[#53974] [ruby-trunk - Feature #8215][Open] Support accessing Fiber-locals and backtraces for a Fiber — "halorgium (Tim Carey-Smith)" <ruby-lang-bugs@...>

14 messages 2013/04/03

[#54095] [ruby-trunk - Feature #8237][Open] Logical method chaining via inferred receiver — "wardrop (Tom Wardrop)" <tom@...>

34 messages 2013/04/08

[#54138] [ruby-trunk - Bug #8241][Open] If uri host-part has underscore ( '_' ), 'URI#parse' raise 'URI::InvalidURIError' — "neocoin (Sangmin Ryu)" <neocoin@...>

9 messages 2013/04/09

[#54185] [CommonRuby - Feature #8257][Open] Exception#cause to carry originating exception along with new one — "headius (Charles Nutter)" <headius@...>

43 messages 2013/04/11

[#54196] Encouraging use of CommonRuby — Charles Oliver Nutter <headius@...>

I think we need to do more to encourage the use of the CommonRuby

20 messages 2013/04/11
[#54200] Re: Encouraging use of CommonRuby — Marc-Andre Lafortune <ruby-core-mailing-list@...> 2013/04/11

Hi,

[#54211] Re: Encouraging use of CommonRuby — "NARUSE, Yui" <naruse@...> 2013/04/12

As far as I understand, what is CommonRuby and the process over CommonRuby

[#54207] [CommonRuby - Feature #8258][Open] Dir#escape_glob — "steveklabnik (Steve Klabnik)" <steve@...>

15 messages 2013/04/12

[#54218] [CommonRuby - Feature #8259][Open] Atomic attributes accessors — "funny_falcon (Yura Sokolov)" <funny.falcon@...>

43 messages 2013/04/12

[#54288] [CommonRuby - Feature #8271][Open] Proposal for moving to a more visible, formal process for feature requests — "headius (Charles Nutter)" <headius@...>

15 messages 2013/04/15

[#54333] Requesting Commit Access — Aman Gupta <ruby@...1.net>

Hello ruby-core,

16 messages 2013/04/16

[#54473] [Backport 200 - Backport #8299][Open] Minor error in float parsing — "bobjalex (Bob Alexander)" <bobjalex@...>

27 messages 2013/04/19

[#54532] [ruby-trunk - Bug #8315][Open] mkmf does not include include paths from pkg_config anymore — "Hanmac (Hans Mackowiak)" <hanmac@...>

11 messages 2013/04/23

[#54621] [ruby-trunk - Feature #8339][Open] Introducing Geneartional Garbage Collection for CRuby/MRI — "ko1 (Koichi Sasada)" <redmine@...>

43 messages 2013/04/27
[#54643] [ruby-trunk - Feature #8339] Introducing Geneartional Garbage Collection for CRuby/MRI — "authorNari (Narihiro Nakamura)" <authorNari@...> 2013/04/28

[#54649] Re: [ruby-trunk - Feature #8339] Introducing Geneartional Garbage Collection for CRuby/MRI — SASADA Koichi <ko1@...> 2013/04/28

(2013/04/28 9:23), authorNari (Narihiro Nakamura) wrote:

[#54657] Re: [ruby-trunk - Feature #8339][Open] Introducing Geneartional Garbage Collection for CRuby/MRI — Magnus Holm <judofyr@...> 2013/04/28

On Sat, Apr 27, 2013 at 8:19 PM, ko1 (Koichi Sasada)

[#54665] [ruby-trunk - Bug #8344][Open] Status of Psych and Syck — "Eregon (Benoit Daloze)" <redmine@...>

18 messages 2013/04/28

[ruby-core:54490] Re: [ruby-trunk - Bug #8254] Ruby segfaults on second SystemStackError from parser

From: SASADA Koichi <ko1@...>
Date: 2013-04-21 14:48:00 UTC
List: ruby-core #54490
charliesome discovered that the reason of this issues is longjmp from
segv handler.

After receiving SIGSEGV, segv handler runs on the altstack.
And returns by *longjmp* ruby's world if it is caused by stack overflow.
https://github.com/ruby/ruby/blob/trunk/signal.c#L670
"longjmp" doesn't care about signal status, and system can't restore
signal status (especially altstack status). System assumes that altstack
is used continuously. and second sigsegv handler can't use altstack.

To solve this issue, charliesome replaced all of setjmp/longjmp pair to
sigsetjmp/siglongjmp by r40402. This change fixes this problem.

However, sigsetjmp/siglongjmp (especially sigsetjmp) requires system
calls and slower than setjmp on the older systems.

$ time ./miniruby -ve '5_000_000.times{1.times{}}'
ruby 2.1.0dev (2013-04-21 trunk 40402) [x86_64-linux]
real    0m3.393s
user    0m1.904s
sys     0m1.488s

$ time ../versions/install-trunk-daily_2013-04-16T12_00/bin/ruby -ve
'5_000_000.times{1.times{}}'
ruby 2.1.0dev (2013-04-16 trunk 40318) [x86_64-linux]
real    0m1.221s
user    0m1.216s
sys     0m0.008s

on Linux 2.6.32-5-amd64 (Debian squid)

So I asked to revert this change (r40403).

---------------------------------------------

charliesome proposed several solutions:

(1) Use libsigsegv

 * I'm not sure because it seems GNU product.

(2) Use sigsetjmp/siglongjmp on newer systems only if there is no
performance problem

(3) Mix sigsetjmp/siglongjmp and setjmp/longjmp

We need to restore signal status (altstack status), so use siglongjmp
only at segv handler.

  (S1) [main] sigsetjmp(root) ($)
  (S2) [main] sigsetjmp(root) .... [foo] setjmp(foo) ... ($)
  (S3) [main] sigsetjmp(root) .... [foo] setjmp(foo) ...
       [bar] setjmp(bar) ($)
  (S4) [main] sigsetjmp(root) .... [foo] setjmp(foo) ...
       [bar] setjmp(bar) ... [SEGV handler] siglongjmp(root) ($)
  (S5) [main] sigsetjmp(root) ($) # signal status was restored
  (S6) [main] sigsetjmp(root) longjmp(bar) ($)
  (S7) [main] sigsetjmp(root) .... [foo] setjmp(foo) ...
       [bar] setjmp(bar) ($)

($) is program counter.

  * This is interesting technique, but I'm not sure this approach
    works fine because longjmp() at (S6) jumps into deeper stack frame.


Ideas are welcome.


(2013/04/11 21:36), charliesome (Charlie Somerville) wrote:
> 
> Issue #8254 has been updated by charliesome (Charlie Somerville).
> 
> 
> =begin
> It seems to happen with any stack overflow from C:
> 
>     #include <ruby/ruby.h>
> 
>     VALUE f() {
>         f();
>     }
>     
>     Init_x() {
>         rb_define_global_function("f", f, 0);
>     }
> 
> When (({f})) is called the second time, Ruby segfaults.
> =end
> ----------------------------------------
> Bug #8254: Ruby segfaults on second SystemStackError from parser
> https://bugs.ruby-lang.org/issues/8254#change-38446
> 
> Author: charliesome (Charlie Somerville)
> Status: Open
> Priority: Normal
> Assignee: 
> Category: 
> Target version: 
> ruby -v: ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin11.4.0]
> 
> 
> =begin
> When the parser overflows the stack, it raises SystemStackError.
> 
> The second time this happens, Ruby segfaults.
> 
> Code sample:
> 
>     n = 10_000 # adjust for your platform
>     begin
>       eval "1+" * n + "1"
>     rescue SystemStackError
>       eval "1+" * n + "1"
>     end
> 
> =end
> 
> 


-- 
// SASADA Koichi at atdot dot net

In This Thread

Prev Next