Mac OS X 10.5 Leopardのucontextが壊れている問題

昨日twitterで騒いでいた件まとめ。問題解決に7時間つぶれた…。

Leopardで有効化されたucontextですが、sizeof(ucontext_t)がAPIApple側実装とで異なっている為にgetcontext()やswapcontext()を使うとメモリ破壊を引き起こします。

詳細は/usr/include/sys/_structs.hの128行あたりを見てください。ここで_XOPEN_SOURCEが有効/無効でsizeof(ucontext_t)が変わりますが、実装は有効、API利用時は無効で定義されるらしく、ポインタで結果を受け取るようなgetcontext/swapcontextのようなAPIを呼び出すと__mcontext_data分だけ多く書き込まれてしまいます。

回避するにはこの_STRUCT_MCONTEXT __mcontext_data分だけ多めにcontext_t領域を確保する必要があります。

libcoroutine diff: http://websvn.nyaxtstep.com/viewvc.cgi/3rdparty/libcoroutine/source/Coro.h?r1=574&r2=660

同じ問題に突き当たっている人がいたみたい:
http://donttreadonme.co.uk/rubinius-irc/rubinius.log.20071113.html