diff options
| author | ksss <[email protected]> | 2017-06-14 18:05:47 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2017-06-14 18:12:56 +0900 |
| commit | 432a813905ec86fadeaa0842b136e4bd1f335b91 (patch) | |
| tree | f0d1e0c6e8f4669bc016ce8083fa684c57948a27 /mrbgems/mruby-string-ext | |
| parent | 19785f43d18891307dd18c1ed33b21099848ca72 (diff) | |
| download | mruby-432a813905ec86fadeaa0842b136e4bd1f335b91.tar.gz mruby-432a813905ec86fadeaa0842b136e4bd1f335b91.zip | |
Fix arena overflow error
Diffstat (limited to 'mrbgems/mruby-string-ext')
| -rw-r--r-- | mrbgems/mruby-string-ext/src/string.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index 4740b356f..f3343447d 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -585,10 +585,12 @@ mrb_str_upto(mrb_state *mrb, mrb_value beg) ISASCII(RSTRING_PTR(beg)[0]) && ISASCII(RSTRING_PTR(end)[0])) { char c = RSTRING_PTR(beg)[0]; char e = RSTRING_PTR(end)[0]; + int ai = mrb_gc_arena_save(mrb); if (c > e || (excl && c == e)) return beg; for (;;) { mrb_yield(mrb, block, mrb_str_new(mrb, &c, 1)); + mrb_gc_arena_restore(mrb, ai); if (!excl && c == e) break; c++; if (excl && c == e) break; @@ -604,11 +606,13 @@ mrb_str_upto(mrb_state *mrb, mrb_value beg) mrb_int bi = mrb_int(mrb, mrb_str_to_inum(mrb, beg, 10, FALSE)); mrb_int ei = mrb_int(mrb, mrb_str_to_inum(mrb, end, 10, FALSE)); char buf[max_width+1]; + int ai = mrb_gc_arena_save(mrb); while (bi <= ei) { if (excl && bi == ei) break; snprintf(buf, sizeof(buf), "%.*d", min_width, bi); mrb_yield(mrb, block, mrb_str_new(mrb, buf, strlen(buf))); + mrb_gc_arena_restore(mrb, ai); bi++; } return beg; @@ -620,6 +624,7 @@ mrb_str_upto(mrb_state *mrb, mrb_value beg) after_end = mrb_funcall(mrb, end, "succ", 0); current = mrb_str_dup(mrb, beg); while (!mrb_str_equal(mrb, current, after_end)) { + int ai = mrb_gc_arena_save(mrb); mrb_value next = mrb_nil_value(); if (excl || !mrb_str_equal(mrb, current, end)) next = mrb_funcall(mrb, current, "succ", 0); @@ -629,6 +634,7 @@ mrb_str_upto(mrb_state *mrb, mrb_value beg) if (excl && mrb_str_equal(mrb, current, end)) break; if (RSTRING_LEN(current) > RSTRING_LEN(end) || RSTRING_LEN(current) == 0) break; + mrb_gc_arena_restore(mrb, ai); } return beg; |
