本日は openssl でライブラリからのコールバックで例外を発生させた時の処理の変更がありました。
nobu:r32535 2011-07-14 10:54:10 +0900
新規追加(や名前の変更)になったファイルの svn property の変更です。
svn:r32536 2011-07-14 10:54:13 +0900
version.h の日付更新。
nahi:r32537 2011-07-14 14:41:05 +0900
openssl で証明書の検証にコールバックを渡して OpenSSL のライブラリから呼ばせていますがそこで例外や大域脱出が発生した場合 OpenSSL の内部を通り抜けて処理が飛ばされるようになっていたため、 OpenSSL 内部での必要な後始末がされていない可能性があるという問題がありました。しかたないのでコールバックの Proc オブジェクトの実行で例外発生時は rb_protect() で捕捉して止めてしまい、警告メッセージを出した上でそのまま握り潰すようにしています。 [ruby-dev:43274] [Bug #4445]
なるほどー、ネイティブライブラリの wrapper としての拡張ライブラリでコールバックを扱う時はこういうことに気をつけないといけませんね。ユーザーデータに例外を記録しておいてライブラリ側の関数から抜けた後で例外を再現させることができれば(あと処理の中断もコールバック関数の返り値等で指定できれば)いいのでしょうけど、コールバックの仕様が対応できないものだと難しいですね。