Project

General

Profile

Actions

Bug #8716

closed

segmation fault 正規表現で大量のグループを利用時

Added by taka-yoshi (taka-yoshi taka) over 10 years ago. Updated over 9 years ago.

Status:
Closed
Target version:
ruby -v:
trunk
[ruby-dev:47562]

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

Actions #1

Updated by nagachika (Tomoyuki Chikanaga) over 10 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 10 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 10 years ago

  • Description updated (diff)
  • Assignee set to k_takata (Ken Takata)

Updated by k_takata (Ken Takata) over 10 years ago

採用予定のパッチです。
https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74
Windowsで落ちなくなったことは確認しましたが、それ以外の環境は未確認です。

Updated by hsbt (Hiroshi SHIBATA) about 10 years ago

  • Target version changed from 2.1.0 to 2.2.0

Updated by k_takata (Ken Takata) about 10 years ago

https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74

Rubyにはおそらく影響しないのですが、上記リンク先を見ていただければ分かるとおり、
マルチスレッド環境でこの変更がうまく動かない場合があるようなので、修正方法を再度検討中です。

Updated by k_takata (Ken Takata) almost 10 years ago

落ちる原因が2つあることが分かりました。

  1. alloca でスタックオーバーフロー (修正済み)
  2. そもそも鬼雲(鬼車も)は、グループの数を short で管理しているため、32767個以上のグループを管理できない。32768個あるとインデックスが負になり、不正アクセスが発生。(未修正)

グループの数を 32bit で管理するようにするか、それとも 16bit のままとし、不正アクセスが発生しないように何らかのチェックを入れるか検討が必要です。

Updated by k_takata (Ken Takata) almost 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 9 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 9 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 9 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 9 years ago

クローズの際の取り決めがあるのかということを気にしていました。
(勝手に閉じて良いのかとか、Backport 欄は誰が何を設定するとか。)

該当修正部分のみを抽出して取り込むことになるかと思います。

関連コミットを挙げておきます。以下の4件となります。

  1. 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

  2. キャプチャグループの数を ONIG_MAX_CAPTURE_GROUP_NUM (32767) 個に制限
    https://github.com/k-takata/Onigmo/commit/c7cda4ed5676167b0d01bb5555724f6164fbdb13

1.9.3 もバックポート対象とした方が良いかもしれません。(が、コンフリクトが発生するはず。)

Updated by usa (Usaku NAKAMURA) over 9 years ago

Ken Takata wrote:

クローズの際の取り決めがあるのかということを気にしていました。
(勝手に閉じて良いのかとか、Backport 欄は誰が何を設定するとか。)

直したら閉じていいですし、直ってるのに閉じてなかったら閉じていいです。
……というくらいのゆるーい運用だと思います、現状は。
あまり厳密なルール作ってもどうせ守られないので、こんなもんでよろしいかと。

Backport欄はUNKNOWNで放置するのが安全です。
それなりの確信があればREQUIREDやDONTNEEDにしてもかまいません。
削除だけは大変に困るので避けていただけると幸いです。

該当修正部分のみを抽出して取り込むことになるかと思います。
関連コミットを挙げておきます。以下の4件となります。

ありがとうございます。助かります。

1.9.3 もバックポート対象とした方が良いかもしれません。(が、コンフリクトが発生するはず。)

1.9.3は通常メンテナンスフェーズを終えているので、セキュリティイシューしか取り扱いません。

Updated by nagachika (Tomoyuki Chikanaga) over 9 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) over 9 years ago

  • Backport changed from 2.0.0: REQUIRED, 2.1: DONE to 2.0.0: DONE, 2.1: DONE

遅ればせながら ruby_2_0_0 にも取り込みました。ありがとうございます。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0