mruby master changes

mruby masterの変更履歴

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は比較すべきではありません。それは未知のアドレスにアクセスし、クラッシュを引き起こします。