[#18440] racc segv revisited — "Akinori MUSHA" <knu@...>

 次のバグの件なんですが、現時点では原因究明を含めて未解決という

24 messages 2002/10/02
[#18617] Re: racc segv revisited — "Akinori MUSHA" <knu@...> 2002/11/02

At Wed, 2 Oct 2002 23:19:59 +0900,

[ruby-dev:18518] Re: Segmentaion fault of miniruby

From: nobu.nakada@...
Date: 2002-10-15 07:43:31 UTC
List: ruby-dev #18518
なかだです。

At Tue, 15 Oct 2002 15:35:19 +0900,
U.Nakamura <usa@osb.att.ne.jp> wrote:
> variable.cのrb_global_entry()内でALLOC()、つまりruby_xmalloc()
> を2回呼び出してるわけですが、2回目のALLOC()でmalloc_increase
> がmalloc_limitより大きくなった場合、またはmalloc()に失敗した
> 場合、rb_gc()が実行されます。
> で、rb_gc() -> rb_gc_mark_global_tbl() -> st_foreach() ->
> mark_global_entry() と呼び出されるのですが、この時点ではvarが
> まだ存在しないので、var->marker()の呼び出しで落ちてしまう、と
> いうことだったようです。

なるほど。つまりentry->varが未初期化のままなわけですか。struct
global_variableとstruct global_entryを分割したときからのバグで
すね。気づきませんでした、すいません。

> @@ -356,4 +356,4 @@ rb_global_entry(id)
>  	entry = ALLOC(struct global_entry);
> -	st_add_direct(rb_global_tbl, id, entry);
>  	var = ALLOC(struct global_variable);
> +	st_add_direct(rb_global_tbl, id, entry);
>  	entry->id = id;

これだとやっぱり*entryは初期化されてないのでは。

# NoMemoryErrorが起きたときにentryやvarがリークしそうな気がしな
# くもないんですが。


Index: variable.c
===================================================================
RCS file: /cvs/ruby/src/ruby/variable.c,v
retrieving revision 1.71
diff -u -2 -p -r1.71 variable.c
--- variable.c	26 Sep 2002 00:48:33 -0000	1.71
+++ variable.c	15 Oct 2002 07:24:51 -0000
@@ -355,5 +355,4 @@ rb_global_entry(id)
 	struct global_variable *var;
 	entry = ALLOC(struct global_entry);
-	st_add_direct(rb_global_tbl, id, entry);
 	var = ALLOC(struct global_variable);
 	entry->id = id;
@@ -367,4 +366,5 @@ rb_global_entry(id)
 	var->block_trace = 0;
 	var->trace = 0;
+	st_add_direct(rb_global_tbl, id, entry);
     }
     return entry;


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread