[groonga-dev,00106] Re: Ruby/groongaにてDatabaseをopenするとSegmentation faultする

アーカイブの一覧に戻る

morit****@razil***** morit****@razil*****
2009年 7月 2日 (木) 14:15:41 JST


森です。

手元で試してみたところ、SIGABRTやSIGSEGVは再現しませんが、
Groonga::Databaseオブジェクトが二重に解放されていることを確認しました。

ruby -rgroonga -e "Groonga::Database.open('testdb')"を実行すると、

 rb_grn_object_alloc
 ↓
 grn_ctx_init
 ↓
 grn_db_open
 ↓
 grn_db_close
 ↓
 grn_ctx_fin
 ↓
 rb_grn_object_free

以上のようなシーケンスで、grn_db_closeで解放したオブジェクトを、
rb_grn_object_freeで再度解放しようとしています。

これを回避するためのruby-groongaに当てるpatchを作りました。

手元の環境ではこれで二重に解放されなくなりました。

試してみていただけると幸いです。


Index: ext/rb-grn-database.c
===================================================================
--- ext/rb-grn-database.c	(リビジョン 412)
+++ ext/rb-grn-database.c	(作業コピー)
@@ -71,6 +71,12 @@
     return rb_grn_object_close(self);
 }
 
+static VALUE
+rb_grn_database_alloc (VALUE klass)
+{
+    return Data_Wrap_Struct(klass, NULL, NULL, NULL);
+}
+
 /*
  * call-seq:
  *   Groonga::Database.create(options=nil) -> Groonga::Database
@@ -123,7 +129,7 @@
 
     database = grn_db_create(context, path, &create_args);
     rb_grn_context_check(context, rb_ary_new4(argc, argv));
-    rb_database = rb_grn_object_alloc(klass);
+    rb_database = rb_grn_database_alloc(klass);
     rb_grn_object_assign(rb_database, rb_context, context,
 			 database, RB_GRN_TRUE);
     rb_iv_set(rb_database, "context", rb_context);
@@ -203,7 +209,7 @@
 {
     VALUE database;
 
-    database = rb_grn_object_alloc(klass);
+    database = rb_grn_database_alloc(klass);
     rb_grn_database_initialize(argc, argv, database);
     if (rb_block_given_p())
         return rb_ensure(rb_yield, database, rb_grn_database_close, database);



groonga-dev メーリングリストの案内
アーカイブの一覧に戻る