From 30b6648b9c53f8c3f5156910758cb37eb0d654a7 Mon Sep 17 00:00:00 2001 From: ksss Date: Mon, 2 Jan 2017 16:33:58 +0900 Subject: Small refactoring: should use RSTR_CAPA --- src/string.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/string.c') diff --git a/src/string.c b/src/string.c index 072bf2226..b57f1cec4 100644 --- a/src/string.c +++ b/src/string.c @@ -154,10 +154,7 @@ str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, size_t len) off = ptr - RSTR_PTR(s); } - if (RSTR_EMBED_P(s)) - capa = RSTRING_EMBED_LEN_MAX; - else - capa = s->as.heap.aux.capa; + capa = RSTR_CAPA(s); if (capa <= RSTRING_EMBED_LEN_MAX) capa = RSTRING_EMBED_LEN_MAX+1; -- cgit v1.2.3 From 8a9a24152a23595fba0802f555d49e0c263836af Mon Sep 17 00:00:00 2001 From: ksss Date: Mon, 2 Jan 2017 16:54:34 +0900 Subject: Fix memory error on str_buf_cat Modify from nofree to embed string --- src/string.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/string.c') diff --git a/src/string.c b/src/string.c index b57f1cec4..ae2e5ccc8 100644 --- a/src/string.c +++ b/src/string.c @@ -695,14 +695,21 @@ mrb_str_modify(mrb_state *mrb, struct RString *s) } if (RSTR_NOFREE_P(s)) { char *p = s->as.heap.ptr; + mrb_int len = s->as.heap.len; - s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)s->as.heap.len+1); + RSTR_UNSET_NOFREE_FLAG(s); + if (len < RSTRING_EMBED_LEN_MAX) { + RSTR_SET_EMBED_FLAG(s); + RSTR_SET_EMBED_LEN(s, len); + } + else { + s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1); + s->as.heap.aux.capa = len; + } if (p) { - memcpy(RSTR_PTR(s), p, s->as.heap.len); + memcpy(RSTR_PTR(s), p, len); } - RSTR_PTR(s)[s->as.heap.len] = '\0'; - s->as.heap.aux.capa = s->as.heap.len; - RSTR_UNSET_NOFREE_FLAG(s); + RSTR_PTR(s)[len] = '\0'; return; } } -- cgit v1.2.3