2.10.14でrubyextがdouble freeする
skf 2.10.14 で rubyextが、次のような simple なテストケースで double free を起こします。2.10.12では発生しません。
ruby-mri -I. -e 'require "skf" ; Skf.convert("-s", [164, 162].pack("C*"))'
パッチにも書きましたが、 2.10.12 -> 2.10.14 で、skf_convert.i の中の convert() で、local変数の lwlstr を return 時に free するよう変更がなされています。 一方 rubyext の場合、同じ関数の入力の cstr は(以前から) return 時に free するようになっていますが、 rubyext の場合、lwlstr が cstr を指している為、 double free が発生します。 他方、他の extension の場合は、 lwlstr は新たに allocate された領域に、 cstr を元に作成します。
ソースを見る限り、 rubyext においては lwlstr は cstr を複製する方が正しい、と考えています。
とりあえず修正しました。ただし、ruby 機能拡張は ruby 側の API 削除の関係で諦めたため、あまり意味がないかも。
skf 2.10.14 で rubyextが、次のような simple なテストケースで double free を起こします。2.10.12では発生しません。
パッチにも書きましたが、 2.10.12 -> 2.10.14 で、skf_convert.i の中の convert() で、local変数の lwlstr を return 時に free するよう変更がなされています。 一方 rubyext の場合、同じ関数の入力の cstr は(以前から) return 時に free するようになっていますが、 rubyext の場合、lwlstr が cstr を指している為、 double free が発生します。 他方、他の extension の場合は、 lwlstr は新たに allocate された領域に、 cstr を元に作成します。
ソースを見る限り、 rubyext においては lwlstr は cstr を複製する方が正しい、と考えています。