[#39420] Marshal.load で例外発生時に Segmentation fault エラー — patamanta@...
金田有二と申します。
5 messages
2009/10/02
[#39421] exception from open-uri — Yusuke ENDOH <mame@...>
遠藤です。
5 messages
2009/10/03
[#39439] [Bug #2179] 1.9.2において block のスコープがおかしいときがある — 益隆 三村 <redmine@...>
Bug #2179: 1.9.2において block のスコープがおかしいときがある
4 messages
2009/10/06
[#39446] Is the maintainer discharging rule approved? and about matrix.rb — Yugui <yugui@...>
Yuguiです。
4 messages
2009/10/08
[#39451] getaddrinfo: Name or service not known (SocketError) in net/ftp — Tanaka Akira <akr@...>
boron で気がついたのですが、net/ftp で login のときに
4 messages
2009/10/09
[#39469] Re: getaddrinfo: Name or service not known (SocketError) in net/ftp
— Shugo Maeda <shugo@...>
2009/10/12
前田です。
[#39453] [BUG: trunk] GC mark bug — SASADA Koichi <ko1@...>
ささだです.
7 messages
2009/10/10
[#39501] [bug:trunk] invalid memory access in 100**900 — Tanaka Akira <akr@...>
以下のように、100**900 を計算すると変なところをアクセスするようです。
4 messages
2009/10/17
[#39506] [Bug:1.9] case 文の式が省略され when 節に配列展開があるときの挙動 — wanabe <s.wanabe@...>
ワナベと申します。
4 messages
2009/10/17
[#39533] [Bug #2263] typo in man/ruby.1 — Narihiro Nakamura <redmine@...>
Bug #2263: typo in man/ruby.1
11 messages
2009/10/24
[#39534] Re: [Bug #2263] typo in man/ruby.1
— Yusuke ENDOH <mame@...>
2009/10/24
遠藤です。
[#39548] [Bug #2291] Net::FTPでソケットをオープンする前にbinary=を呼び出すと落ちる — Akira Matsuda <redmine@...>
Bug #2291: Net::FTPでソケットをオープンする前にbinary=を呼び出すと落ちる
10 messages
2009/10/27
[#39578] [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する — Nozomu Kurasawa <redmine@...>
Bug #2308: セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する
5 messages
2009/10/30
[#39579] [Bug #2310] should ensure GVL_UNLOCK_END in rb_thread_blocking_region — _ wanabe <redmine@...>
Bug #2310: should ensure GVL_UNLOCK_END in rb_thread_blocking_region
4 messages
2009/10/30
[#39584] Re: [ruby-cvs:32774] Ruby:r25556 (trunk): * array.c (rb_ary_to_ary): do not use #respond_to? to detect — Nobuyoshi Nakada <nobu@...>
なかだです。
6 messages
2009/10/30
[#39585] Re: [ruby-cvs:32774] Ruby:r25556 (trunk): * array.c (rb_ary_to_ary): do not use #respond_to? to detect
— Yukihiro Matsumoto <matz@...>
2009/10/30
まつもと ゆきひろです
[#39589] Re: [ruby-cvs:32774] Ruby:r25556 (trunk): * array.c (rb_ary_to_ary): do not use #respond_to? to detect
— Yukihiro Matsumoto <matz@...>
2009/10/30
まつもと ゆきひろです
[#39591] Re: [ruby-cvs:32774] Ruby:r25556 (trunk): * array.c (rb_ary_to_ary): do not use #respond_to? to detect
— Nobuyoshi Nakada <nobu@...>
2009/10/30
なかだです。
[#39592] infinite recursive call to C function — Yusuke ENDOH <mame@...>
遠藤です。
17 messages
2009/10/30
[#39596] Re: infinite recursive call to C function
— Yukihiro Matsumoto <matz@...>
2009/10/30
まつもと ゆきひろです
[#39599] Re: infinite recursive call to C function
— Nobuyoshi Nakada <nobu@...>
2009/11/02
なかだです。
[#39601] Re: infinite recursive call to C function
— Yukihiro Matsumoto <matz@...>
2009/11/02
まつもと ゆきひろです
[#39602] Re: infinite recursive call to C function
— Nobuyoshi Nakada <nobu@...>
2009/11/02
なかだです。
[#39603] Re: infinite recursive call to C function
— Yukihiro Matsumoto <matz@...>
2009/11/02
まつもと ゆきひろです
[#39605] Re: infinite recursive call to C function
— Nobuyoshi Nakada <nobu@...>
2009/11/02
なかだです。
[#39608] Re: infinite recursive call to C function
— Yukihiro Matsumoto <matz@...>
2009/11/02
まつもと ゆきひろです
[#39609] Re: infinite recursive call to C function
— Nobuyoshi Nakada <nobu@...>
2009/11/02
なかだです。
[#39610] Re: infinite recursive call to C function
— Yukihiro Matsumoto <matz@...>
2009/11/02
まつもと ゆきひろです
[ruby-dev:39593] infinite recursive rb_block_call
From:
Yusuke ENDOH <mame@...>
Date:
2009-10-30 13:17:04 UTC
List:
ruby-dev #39593
遠藤です。
[ruby-core:24794] と似たような問題は、rb_block_call でも起きるようです。
$ ./ruby -e '
class C
include Enumerable
alias :each :min
end
C.new.min
'
Segmentation fault
min 以外でも Enumerable のメソッドで大抵落ちるみたいです。
rb_funcall_no_recursive を真似て rb_block_call_no_recursive を作って
見ました。[ruby-dev:39592] の相互再帰の問題は同じようにあると思います。
この方針だとほぼすべての rb_block_call の呼び出しを書き換えて戻り値が
Qundef でないかどうかチェックする必要がありそうです。可読性や性能を
犠牲にしてでも、このような異常なプログラムを救済すべきでしょうか
(Qundef を返さず直接例外を投げればもう少しすっきりする?)
Index: enum.c
===================================================================
--- enum.c (revision 25576)
+++ enum.c (working copy)
@@ -1101,7 +1101,10 @@
rb_block_call(obj, id_each, 0, 0, min_ii, (VALUE)result);
}
else {
- rb_block_call(obj, id_each, 0, 0, min_i, (VALUE)result);
+ VALUE ret = rb_block_call_no_recursive(obj, id_each, 0, 0, min_i,
(VALUE)result, enum_min);
+ if (ret == Qundef) {
+ rb_raise(rb_eRuntimeError, "recursive call to Enumerable#min");
+ }
}
if (result[0] == Qundef) return Qnil;
return result[0];
Index: vm_eval.c
===================================================================
--- vm_eval.c (revision 25576)
+++ vm_eval.c (working copy)
@@ -815,7 +815,48 @@
return rb_iterate(iterate_method, (VALUE)&arg, bl_proc, data2);
}
+struct iter_method_arg_no_recursive {
+ struct iter_method_arg arg;
+ VALUE (*func)();
+};
+
+static VALUE
+iterate_method_no_recursive(VALUE obj)
+{
+ const struct iter_method_arg_no_recursive * arg =
+ (struct iter_method_arg_no_recursive *) obj;
+ rb_method_entry_t *me = rb_search_method_emtry(arg->arg.obj, arg->arg.mid);
+ rb_thread_t *th = GET_THREAD();
+ int call_status;
+
+ if (!me) return Qundef;
+ if (me->def && me->def->type == VM_METHOD_TYPE_CFUNC &&
+ me->def->body.cfunc.func == arg->func)
+ return Qundef;
+ call_status = rb_method_call_status(th, me, CALL_FCALL, Qundef);
+ if (call_status != NOEX_OK) {
+ return Qundef;
+ }
+ stack_check();
+ iterate_method((VALUE) &arg->arg);
+}
+
VALUE
+rb_block_call_no_recursive(VALUE obj, ID mid, int argc, VALUE * argv,
+ VALUE (*bl_proc) (ANYARGS), VALUE data2,
+ VALUE (*func)())
+{
+ struct iter_method_arg_no_recursive arg;
+
+ arg.arg.obj = obj;
+ arg.arg.mid = mid;
+ arg.arg.argc = argc;
+ arg.arg.argv = argv;
+ arg.func = func;
+ return rb_iterate(iterate_method_no_recursive, (VALUE)&arg,
bl_proc, data2);
+}
+
+VALUE
rb_each(VALUE obj)
{
return rb_call(obj, idEach, 0, 0, CALL_FCALL);
--
Yusuke ENDOH <mame@tsg.ne.jp>