Bug #8716
closedsegmation fault 正規表現で大量のグループを利用時
Description
=begin
WindowsとOS Xで検証しました。
*再現手順 ruby 2.0.0p247 (2013-06-27) [x64-mingw32]
a="()"
(32767.times{a<<'()'}
eval "/#{a}/=~''"
*再現手順 ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.1]
a="()"
(1<<21).times{a<<'()'}
eval "/#{a}/=~''"
以上よろしくお願いします。
=end
Updated by nagachika (Tomoyuki Chikanaga) over 11 years ago
- Tracker changed from Backport to Bug
- Project changed from Backport200 to Ruby master
- Status changed from Open to Feedback
Backport200 は 2.0.0 ブランチへのバックポートチケット用ですので一旦 ruby-trunk へ移動します。
なお手元では trunk でも 2.0.0 でも再現しませんでした。
SEGV 発生時のバックトレースなどのメッセージを添付していただけませんか。
Mac OS X 版では C のバックトレースは ~/Library/Logs/DiagnosticReports の下にファイルで置かれますので、そちらもお願いします。
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
- Category set to regexp
- Status changed from Feedback to Assigned
- Target version set to 2.1.0
- ruby -v set to trunk
regexec.c:match_at()で呼ばれるSTACK_INITがサイズを考慮せずにxallocaしているため、スタックオーバーフローしています。
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
- Description updated (diff)
- Assignee set to k_takata (Ken Takata)
Updated by k_takata (Ken Takata) over 11 years ago
採用予定のパッチです。
https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74
Windowsで落ちなくなったことは確認しましたが、それ以外の環境は未確認です。
Updated by hsbt (Hiroshi SHIBATA) almost 11 years ago
- Target version changed from 2.1.0 to 2.2.0
Updated by k_takata (Ken Takata) over 10 years ago
https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74
Rubyにはおそらく影響しないのですが、上記リンク先を見ていただければ分かるとおり、
マルチスレッド環境でこの変更がうまく動かない場合があるようなので、修正方法を再度検討中です。
Updated by k_takata (Ken Takata) over 10 years ago
落ちる原因が2つあることが分かりました。
- alloca でスタックオーバーフロー (修正済み)
- そもそも鬼雲(鬼車も)は、グループの数を short で管理しているため、32767個以上のグループを管理できない。32768個あるとインデックスが負になり、不正アクセスが発生。(未修正)
グループの数を 32bit で管理するようにするか、それとも 16bit のままとし、不正アクセスが発生しないように何らかのチェックを入れるか検討が必要です。
Updated by k_takata (Ken Takata) over 10 years ago
キャプチャグループの数を ONIG_MAX_CAPTURE_GROUP_NUM
(32767) 個に制限することにしました。
それに合わせて、ONIGERR_TOO_MANY_CAPTURE_GROUPS
というエラーコードを新設することにしました。
https://github.com/k-takata/Onigmo/commit/c7cda4ed5676167b0d01bb5555724f6164fbdb13
tmp/ruby-2.0.x
ブランチも更新済みです。 # ブランチ名をそろそろどうにかすべきかも
Updated by k_takata (Ken Takata) over 10 years ago
- Assignee changed from k_takata (Ken Takata) to naruse (Yui NARUSE)
r46831 で Onigmo 5.14.1 がマージされましたので、これも取り込まれました。
チケットのクローズ手順がよく分かっていないので、処理をお願いします。>NARUSEさん
(あと #9344 も)
Ruby 2.0/2.1へのバックポートはどうしましょうか。
Updated by sorah (Sorah Fukumori) over 10 years ago
- Status changed from Assigned to Closed
閉じます
Edit → Status → Closed ですね。あるいは ChangeLog/commitMessage で [Bug #8716] とか。
http://img.sorah.jp/20140717_16.34_urw8d_Bug_8716_segmation_fault___rubytrunk__Ruby_Issue_Tracking_System.png
Updated by usa (Usaku NAKAMURA) over 10 years ago
- Backport set to 2.0.0: REQUIRED, 2.1: REQUIRED
Ken Takata wrote:
Ruby 2.0/2.1へのバックポートはどうしましょうか。
該当修正部分のみを抽出して取り込むことになるかと思います。
しかし、backportチケットから持ってくるとBackport欄が空白になるというのは
本当に困るのでどうにかならないものかしらん?
Updated by k_takata (Ken Takata) over 10 years ago
クローズの際の取り決めがあるのかということを気にしていました。
(勝手に閉じて良いのかとか、Backport 欄は誰が何を設定するとか。)
該当修正部分のみを抽出して取り込むことになるかと思います。
関連コミットを挙げておきます。以下の4件となります。
-
alloca でスタックオーバーフロー
https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74
https://github.com/k-takata/Onigmo/commit/c1fc76b9bd463948ffc5058bc352bf93732f0314
https://github.com/k-takata/Onigmo/commit/a0efc0a200f7108ca3d5ac3039c8f952e0051619 -
キャプチャグループの数を ONIG_MAX_CAPTURE_GROUP_NUM (32767) 個に制限
https://github.com/k-takata/Onigmo/commit/c7cda4ed5676167b0d01bb5555724f6164fbdb13
1.9.3 もバックポート対象とした方が良いかもしれません。(が、コンフリクトが発生するはず。)
Updated by usa (Usaku NAKAMURA) over 10 years ago
Ken Takata wrote:
クローズの際の取り決めがあるのかということを気にしていました。
(勝手に閉じて良いのかとか、Backport 欄は誰が何を設定するとか。)
直したら閉じていいですし、直ってるのに閉じてなかったら閉じていいです。
……というくらいのゆるーい運用だと思います、現状は。
あまり厳密なルール作ってもどうせ守られないので、こんなもんでよろしいかと。
Backport欄はUNKNOWNで放置するのが安全です。
それなりの確信があればREQUIREDやDONTNEEDにしてもかまいません。
削除だけは大変に困るので避けていただけると幸いです。
該当修正部分のみを抽出して取り込むことになるかと思います。
関連コミットを挙げておきます。以下の4件となります。
ありがとうございます。助かります。
1.9.3 もバックポート対象とした方が良いかもしれません。(が、コンフリクトが発生するはず。)
1.9.3は通常メンテナンスフェーズを終えているので、セキュリティイシューしか取り扱いません。
Updated by nagachika (Tomoyuki Chikanaga) over 10 years ago
- Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE
r47223 で ruby_2_1
ブランチに r46831 から抽出して頂いた関連コミットの部分をバックポートしました。
関連する変更点を提示して頂いて大変助かりました、ありがとうございます。
Updated by usa (Usaku NAKAMURA) about 10 years ago
- Backport changed from 2.0.0: REQUIRED, 2.1: DONE to 2.0.0: DONE, 2.1: DONE
遅ればせながら ruby_2_0_0
にも取り込みました。ありがとうございます。