[Senna-dev 942] sen_hash_delete_by_id() SEGV

Back to archive index

Kouhei Sutou kou****@cozmi*****
2008年 7月 7日 (月) 10:51:49 JST


須藤です。

キーサイズがuint32_tでIHP()が真なハッシュ(IはIOのI?)に対して
sen_hash_delete_by_id()をすると落ちます。

  sen_ctx *context;
  sen_hash *hash;
  uint32_t key;
  sen_table_search_flags flags;
  sen_id id;

  context = sen_ctx_open(NULL, SEN_CTX_USEQL);
  hash = sen_hash_create(context, "/tmp/xxx", sizeof(uint32_t), 64,
                         0, sen_enc_default);

  key = 29;
  flags = SEN_TABLE_ADD;
  id = sen_hash_lookup(hash, &key, sizeof(uint32_t), NULL, &flags);
  sen_hash_delete_by_id(hash, id);

とりあえず、これで落ちなくなるのですが、これでいいかどうかは
わかりません。。。

Index: lib/hash.c
===================================================================
--- lib/hash.c	(リビジョン 914)
+++ lib/hash.c	(作業コピー)
@@ -650,8 +650,10 @@
         if (IHP(hash)) {
           uint32_t size = ee->size - 1;
           struct sen_hash_header *hh = hash->header;
-          ee->key = hh->garbages[size];
-          hh->garbages[size] = id;
+          if (ee->size != 0) {
+            ee->key = hh->garbages[size];
+            hh->garbages[size] = id;
+          }
         } else {
           ee->key = hash->garbages;
           hash->garbages = id;




Senna-dev メーリングリストの案内
Back to archive index