From: Nobuyoshi Nakada Date: 2007-06-08T02:53:02+09:00 Subject: [ruby-dev:30926] Re: segv when reentering into Fiber with callcc なかだです。 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 `
': 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はできる。 中田 伸悦