Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zlib で圧縮したカラムから値を取得しようとすると segmentation fault #6

Closed
ytaka opened this issue Nov 4, 2011 · 5 comments

Comments

@ytaka
Copy link

ytaka commented Nov 4, 2011

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

私が直せれば良いのですが、ぜんぜんコードを追えていないので、
修正をお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <groonga.h>

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;
}
@kou
Copy link
Member

kou commented Nov 4, 2011

すみません。。。再現しませんでした。。。
年のため、実行方法と実行結果を貼ってもらえないでしょうか?

@kou
Copy link
Member

kou commented Nov 4, 2011

すみません!zlibが有効になっていない状態で試していました!
zlibが有効な場合はちゃんと(?)SEGVしたので、調べてみます!

@kou
Copy link
Member

kou commented Nov 4, 2011

一応、動くようにはしたのですがメモリリークします。。。
抜本的にAPIを考え直さないといけなそうなのですぐには直らなそうです。すみません。。。

とりあえず、SEGVはしなくなったのでこれはcloseします。

@kou kou closed this as completed Nov 4, 2011
@ytaka
Copy link
Author

ytaka commented Nov 5, 2011

しばらくは zlib なしで使います。
修正ありがとうございました。

@kou
Copy link
Member

kou commented Nov 5, 2011

すみません。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants