>>  int
>>  ruby_stack_check(void)
>>  {
>>  #if defined(POSIX_SIGNAL) && defined(SIGSEGV) && defined(HAVE_SIGALTSTACK)
>>     return 0;
>>  #else
>> -    return stack_check();
>> +    return stack_check(WATER_MARK);
>>  #endif
>>  }
>
> 今気づいたのですが、この関数の仮定がFiberで成立してない気がします。
> なかださんか、ささださんに言うべきだけど。
> #if defined(POSIX_SIGNAL) && defined(SIGSEGV) && defined(HAVE_SIGALTSTACK)
> の場合は、sigsegv()ハンドラで実際にSIGSEGVが配送されてからsysstack_errorをraiseするかどうか
> 決めてるけど、ここで判定に失敗してsysstackではなくrb_bugのほうに行ってしまうのもバグっぽい
> 気がします。FiberでGC以外が原因でstackあふれたときに同じくSEGVしてしまうので。

すいません、これ誤報でした。
つい最近いれた、[Bug #1813] 対応でちゃんとraise sysstack するようになってました。
現在のtrunkだと、gc時にスタックつきやぶると gc -> sigsegv -> raise -> rb_newobj ->
gcネストで死亡 となります。なので、nariさんパッチですべて解決のようです。