mruby master changes 3fefe52
2015-02-25 00:13 kou commit 3fefe52
mrb_realloc()関数のあとにクラッシュする不具合を修正しています。
次のプログラムでこの問題が再現します:
#include <mruby.h> static mrb_value recursive(mrb_state *mrb, mrb_value self) { mrb_int n; mrb_get_args(mrb, "i", &n); if (n == 0) { mrb_raise(mrb, E_RUNTIME_ERROR, "XXX"); } else { mrb_funcall(mrb, self, "recursive", 1, mrb_fixnum_value(n - 1)); } return self; } int main(void) { mrb_state *mrb; mrb = mrb_open(); mrb_define_method(mrb, mrb->kernel_module, "recursive", recursive, MRB_ARGS_REQ(1)); mrb_funcall(mrb, mrb_top_self(mrb), "recursive", 1, mrb_fixnum_value(30)); mrb_close(mrb); }
再帰メソッド呼び出しは必要ありません。それはcall infoスタックをただ拡大するだけです。 mrb_realloc()がcipush()で呼ばれる場合, cibaseアドレスは変更されます。なので,mrb_realloc()前のciとmrb_realloc()後のcibaseは比較すべきではありません。それは未知のアドレスにアクセスし、クラッシュを引き起こします。