なかだです。

At Thu, 7 Jun 2007 19:44:26 +0900,
Yusuke ENDOH wrote in [ruby-dev:30923]:
> 前の例で落ちなくなることを確認しましたが、
> また callcc と Fiber がらみで別の例を見つけてしまいました。
> 
> $ ./ruby -e '
> c = callcc {|c| c }
> Fiber.new { c.call }.yield
> '
> -e:3:in `<main>': unhandled exception
> SEGV recieved in SEGV handler

スタックの保存用領域の二重解放のようですね。

> 同じ問題かどうかはわかりませんが、
> 以下は Ctrl-C で止めた後に segv を受けます。
> あと、エラーの行番号もなんか変です。

行番号は手元のではちゃんと出てるんですが、どこの修正だったかな…。


Index: cont.c =================================================================== --- cont.c (revision 12471) +++ cont.c (working copy) @@ -70,5 +70,9 @@ cont_free(void *ptr) if (ptr) { rb_context_t *cont = ptr; - FREE_UNLESS_NULL(cont->saved_thread.stack); + rb_thread_t *th = DATA_PTR(cont->saved_thread.self); + + if (cont->saved_thread.stack != th->stack) { + FREE_UNLESS_NULL(cont->saved_thread.stack); + } FREE_UNLESS_NULL(cont->machine_stack); FREE_UNLESS_NULL(cont->vm_stack);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦