diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index a562bdac1..41c84eff1 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -153,12 +153,14 @@ fmt_float(char *buf, size_t buf_size, char fmt, int flags, mrb_int width, int pr } #endif -#define CHECK(l) do { \ - while ((l) >= bsiz - blen) {\ - if (bsiz > MRB_INT_MAX/2) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier"); \ - bsiz*=2;\ +#define CHECK(l) do { \ + if (blen+(l) >= bsiz) {\ + while (blen+(l) >= bsiz) {\ + if (bsiz > MRB_INT_MAX/2) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier");\ + bsiz*=2;\ + }\ + mrb_str_resize(mrb, result, bsiz);\ }\ - mrb_str_resize(mrb, result, bsiz);\ buf = RSTRING_PTR(result);\ } while (0)