From: Ken Takata Date: 2012-03-15T23:30:01+09:00 Subject: [ruby-dev:45366] [ruby-trunk - Bug #6143] Onigmo allows broken regexp: /(?(x.)/ Issue #6143 has been updated by Ken Takata. Onigmoのmasterブランチには修正を入れました。 https://github.com/k-takata/Onigmo/commit/35f530676970e42b83b5d6789dd5820101e430d7 現在のOnigmoは、条件式の条件には番号または名前による後方参照しか使えないのですが、それ以外のものをエラーではじいていませんでした。 ---------------------------------------- Bug #6143: Onigmo allows broken regexp: /(?(x.)/ https://bugs.ruby-lang.org/issues/6143#change-24607 Author: Yusuke Endoh Status: Open Priority: Normal Assignee: Yui NARUSE Category: Target version: ruby -v: ruby 2.0.0dev (2012-03-14 trunk 35017) [i686-linux] naruse さん、k-takata さん 遠藤です。 Onigmo の条件式正規表現のパースでエラーチェックが足りないようです。 $ ./miniruby -e 'p /(?(x.)/' /(?(x.)/ マッチさせると、未初期化変数を使って分岐とかしてしまうようです。 $ valgrind ./miniruby -e '"x"[/(?(x)/]' (略) ==25802== Conditional jump or move depends on uninitialised value(s) ==25802== at 0x210DE2: match_at (regexec.c:2875) ==25802== by 0x214F09: onig_search_gpos (regexec.c:4172) ==25802== by 0x215B02: onig_search (regexec.c:3877) ==25802== by 0x1FE91A: rb_reg_search (re.c:1373) ==25802== by 0x242A98: rb_str_aref_m (string.c:3128) ==25802== by 0x287E04: call_cfunc (vm_insnhelper.c:365) ==25802== by 0x299FC6: vm_call_method (vm_insnhelper.c:452) ==25802== by 0x28CB03: vm_exec_core (insns.def:1906) ==25802== by 0x2934A9: vm_exec (vm.c:1223) ==25802== by 0x29B5CA: rb_iseq_eval_main (vm.c:1463) ==25802== by 0x1615D3: ruby_exec_internal (eval.c:204) ==25802== by 0x48EE112: (below main) (libc-start.c:226) (略) regparse.c の parse_enclose の 4970 case '(': /* conditional expression: (?(cond)yes), (?(cond)yes|no) */ あたりをご確認ください。 このバグは Coverity Scan さんが見つけてくれました。 -- Yusuke Endoh -- http://bugs.ruby-lang.org/