From: matz@... (Yukihiro Matsumoto) Date: 1999-10-20T15:13:43+09:00 Subject: [ruby-dev:8068] Re: Marshal#load segmentation fault まつもと ゆきひろです In message "[ruby-dev:8067] Marshal#load segmentation fault" on 99/10/20, A.Shigihara writes: |SGmailでMarshal#loadがsegmantation faultで落ちたときのgdbのbacktraceです。 どうもです。このパッチが有効ではないかと思います。 試してみてください。 --- marshal.c 1999/08/24 08:21:53 1.3 +++ marshal.c 1999/10/20 06:12:59 @@ -451,3 +451,3 @@ st_table *symbol; - st_table *data; + VALUE data; VALUE proc; @@ -604,3 +604,3 @@ } - st_insert(arg->data, arg->data->num_entries, v); + rb_hash_aset(arg->data, INT2FIX(RHASH(arg->data)->tbl->num_entries), v); return v; @@ -614,2 +614,3 @@ int type = r_byte(arg); + long id; @@ -617,3 +618,4 @@ case TYPE_LINK: - if (st_lookup(arg->data, r_long(arg), &v)) { + id = r_long(arg); + if (v = rb_hash_aref(arg->data, INT2FIX(id))) { return v; @@ -621,3 +623,3 @@ rb_raise(rb_eArgError, "dump format error (unlinked)"); - break; + break; @@ -813,3 +815,2 @@ st_free_table(arg->symbol); - st_free_table(arg->data); return 0; @@ -848,2 +849,4 @@ if (major == MARSHAL_MAJOR) { + volatile VALUE hash; /* protect from GC */ + if (r_byte(&arg) != MARSHAL_MINOR) { @@ -852,3 +855,3 @@ arg.symbol = st_init_numtable(); - arg.data = st_init_numtable(); + arg.data = hash = rb_hash_new(); if (NIL_P(proc)) arg.proc = 0;