[ruby-core:64856] Re: [ruby-trunk - Bug #10206] garbage symbols crash symbol GC

From: Eric Wong <normalperson@...>
Date: 2014-09-08 10:35:24 UTC
List: ruby-core #64856
Eric Wong <normalperson@yhbt.net> wrote:
> I think this may be a fix (still testing):

Nope.  However, I think it takes longer in the test-all loop to
reproduce the problem.

> --- a/symbol.c
> +++ b/symbol.c
> @@ -458,7 +458,10 @@ dsymbol_pindown(VALUE sym)
>  
>      if (UNLIKELY(SYMBOL_PINNED_P(sym) == 0)) {
>  	VALUE fstr = RSYMBOL(sym)->fstr;
> -	sym = dsymbol_check(sym);
> +
> +	if (UNLIKELY(rb_objspace_garbage_object_p(sym))) {
> +	    rb_bug("attempted to pindown garbage sym");
> +	}

I still hit this rb_bug (similar backtraces as before).

>  	FL_SET(sym, SYMBOL_PINNED);
>  
>  	/* make it permanent object */
> @@ -525,6 +528,9 @@ rb_intern_cstr_without_pindown(const char *name, long len, rb_encoding *enc)
>      OBJ_FREEZE(str);
>  
>      if (st_lookup(global_symbols.str_id, str, &id)) {
> +	if (ID_DYNAMIC_SYM_P((ID)id)) {
> +	    return (ID)dsymbol_check((VALUE)id);
> +	}

However, I think this dsymbol_check still is worthwhile.

>  	return (ID)id;
>      }
>  

In This Thread

Prev Next