groonga/groonga — Issue #6: zlib で圧縮したカラムから値を取得しようとすると segmentation fault
Author: ytaka
Created: 2011-11-04 04:41:04+00:00
State: open

たびたびすみません。
次のコードで segmentation fault になります。
grn_obj_get_value のところなのですが、
続けて2回実行すると grn_obj_set_value でも segmentation fault になります。
上書きする場合にもなにかバグがありそうです。
zlib を使わない場合は問題ないです。

私が直せるほどコードを追えていないので、
修正をお願いします。

#include
#include
#include
#include

int
main(int argc, char **argv)
{
unsigned key_size = 8;
grn_ctx ctx;
grn_obj *db, *table, *column, *key_type, *value_type;
grn_id id;
grn_obj buf;
grn_rc rc;
int added;
grn_obj value, bulk;
const char *path = "db";
if (grn_init()) {
fprintf(stderr, "grn_init() failed\n");
return -1;
}
if (grn_ctx_init(&ctx, 0)) {
fprintf(stderr, "grn_ctx_init() failed\n");
return -1;
}
db = grn_db_open(&ctx, path);
if (!db) { db = grn_db_create(&ctx, path, NULL); }
if (!db) {
fprintf(stderr, "db initialize failed\n");
return -1;
}

key_type = grn_ctx_at(&ctx, GRN_DB_SHORT_TEXT);
GRN_TABLE_OPEN_OR_CREATE(&ctx, "t1", 2, NULL,
GRN_OBJ_TABLE_HASH_KEY|GRN_OBJ_PERSISTENT,
key_type, NULL, table);

value_type = grn_ctx_at(&ctx, GRN_DB_TEXT);
GRN_COLUMN_OPEN_OR_CREATE(&ctx, table, "c1", 2, NULL,
GRN_OBJ_PERSISTENT|GRN_OBJ_COMPRESS_ZLIB,
/* GRN_OBJ_PERSISTENT, */
value_type, column);

id = grn_table_add(&ctx, table, "hello", 5, &added);
printf("id=%d, added=%d\n", id, added);

GRN_TEXT_INIT(&value, 0);
GRN_TEXT_PUT(&ctx, &value, "world", 5);
rc = grn_obj_set_value(&ctx, column, id, &value, GRN_OBJ_SET);
printf("grn_obj_set_value: rc=%d\n", rc);

GRN_TEXT_INIT(&bulk, 0);
GRN_BULK_REWIND(&bulk);
grn_obj_get_value(&ctx, column, id, &bulk);
printf("%s\n", GRN_BULK_HEAD(&bulk));

grn_obj_close(&ctx, &bulk);

if (grn_obj_close(&ctx, db)) {
fprintf(stderr, "grn_obj_close() failed\n");
return -1;
}
if (grn_ctx_fin(&ctx)) {
fprintf(stderr, "grn_ctx_fin() failed\n");
return -1;
}
if (grn_fin()) {
fprintf(stderr, "grn_fin() failed\n");
return -1;
}
return 0;
}