Kouhei Sutou
kou****@clear*****
2009年 7月 28日 (火) 15:41:25 JST
須藤です。
grn_ctxはスタックを持っていますが、何度もgrn_expr_exec()して
いるとスタックがオーバーフローしてしまいます。
よくわかっていないのですが、sizeof(grn_obj *)で割る必要があ
るのかなぁと思いました。
diff --git a/lib/db.c b/lib/db.c
index 93b3c6d..aa57446 100644
--- a/lib/db.c
+++ b/lib/db.c
@@ -5460,7 +5460,7 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
}
#define WITH_SPSAVE(block) {\
- ctx->impl->stack_curr = sp - ctx->impl->stack;\
+ ctx->impl->stack_curr = (sp - ctx->impl->stack) / sizeof(grn_obj *);\
block\
if (sp != ctx->impl->stack + ctx->impl->stack_curr) {\
sp = ctx->impl->stack + ctx->impl->stack_curr;\
@@ -6309,7 +6309,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr)
}
}
res = s0;
- ctx->impl->stack_curr = sp == ctx->impl->stack ? 0 : sp - ctx->impl->stack - 1;
+ ctx->impl->stack_curr = sp == ctx->impl->stack ? 0 : (sp - ctx->impl->stack - 1) / sizeof(grn_obj *);
}
exit :
GRN_API_RETURN(res);
--
須藤 功平 <kou****@clear*****>
株式会社クリアコード (http://www.clear-code.com/)