Bug #2777
closedInvalid read of size 4 by redefining load
Description
=begin
なかだです。
At Mon, 22 Feb 2010 01:20:07 +0900,
Tanaka Akira wrote in [ruby-dev:40452]:
以下のように load 中に load を再定義すると、変なところをアクセスするのが
valgrind で観測されます。
rb_method_entry_tにもrefcountを入れますかねぇ。
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by ko1 (Koichi Sasada) almost 15 years ago
=begin
(2010/02/22 15:03), Nobuyoshi Nakada wrote::
rb_method_entry_tにもrefcountを入れますかねぇ。
性能の観点から反対します.
さっきの IRC に書いた内容ですが,こんな感じでどうでしょうか.大仰な気
もしますが.
(1) unlink された me を保存しておく
(2) 一定のタイミング(多分,GCタイミング)でフレームを走査して
保存した me に mark
(3) mark がついてないのを消す(sweep)
NODE に戻すってのも一案ですが....
--
// SASADA Koichi at atdot dot net
=end
Updated by mame (Yusuke Endoh) over 14 years ago
- Assignee set to ko1 (Koichi Sasada)
- Priority changed from 3 to Normal
- Target version set to 1.9.2
- ruby -v set to -
=begin
遠藤です。
% cat tst.rb
module Kernel
def load(*args)
end
end
raise
% valgrind ./ruby -ve 'load "tst.rb"'
snip
というオリジナルの問題は r27393 で巧妙に回避されましたが、本質的には
解決しておらず、以下で SEGV します。
class C
define_method(:foo) do
C.class_eval { remove_method(:foo) }
super()
end
end
C.new.foo
あと、r27393 だと rb_method_definition_t の参照を減らしていないので
メモリリークするような気がします。
diff --git a/vm_method.c b/vm_method.c
index 04b62f2..c9d99db 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -215,6 +215,14 @@ rb_add_method_def(VALUE klass, ID mid, rb_method_type_t type, rb_method_definiti
* another problem when the usage is changed.
*/
me = old_me;
+
- if (me->def) {
-
if (me->def->alias_count == 0)
-
xfree(me->def);
-
else if (me->def->alias_count > 0)
-
me->def->alias_count--;
-
me->def = 0;
- }
}
else {
me = ALLOC(rb_method_entry_t);
--
Yusuke Endoh mame@tsg.ne.jp
=end
Updated by ko1 (Koichi Sasada) over 14 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r27634.
Nobuyoshi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end