Bug #8716

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

Added by taka-yoshi taka 9 months ago. Updated about 5 hours ago.

[ruby-dev:47562]
Status:Assigned
Priority:Normal
Assignee:Ken Takata
Category:regexp
Target version:current: 2.2.0
ruby -v:trunk Backport:

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

History

#1 Updated by Tomoyuki Chikanaga 9 months ago

  • Tracker changed from Backport to Bug
  • Project changed from Backport200 to ruby-trunk
  • Status changed from Open to Feedback

Backport200 は 2.0.0 ブランチへのバックポートチケット用ですので一旦 ruby-trunk へ移動します。

なお手元では trunk でも 2.0.0 でも再現しませんでした。
SEGV 発生時のバックトレースなどのメッセージを添付していただけませんか。
Mac OS X 版では C のバックトレースは ~/Library/Logs/DiagnosticReports の下にファイルで置かれますので、そちらもお願いします。

#2 Updated by Nobuyoshi Nakada 9 months 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:matchat()で呼ばれるSTACKINITがサイズを考慮せずにxallocaしているため、スタックオーバーフローしています。

#3 Updated by Nobuyoshi Nakada 9 months ago

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

#4 Updated by Ken Takata 8 months ago

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

#5 Updated by Hiroshi SHIBATA 3 months ago

  • Target version changed from 2.1.0 to current: 2.2.0

#6 Updated by Ken Takata about 1 month ago

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

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

#7 Updated by Ken Takata 3 days ago

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

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

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

#8 Updated by Ken Takata about 5 hours 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 ブランチも更新済みです。 # ブランチ名をそろそろどうにかすべきかも

Also available in: Atom PDF