Commit 23df879a authored by h2so5's avatar h2so5

Fix a problem of 'z' option and shared string

parent aa099f7f
...@@ -489,14 +489,19 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) ...@@ -489,14 +489,19 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_value ss; mrb_value ss;
struct RString *s; struct RString *s;
char **ps; char **ps;
mrb_int len;
ps = va_arg(ap, char**); ps = va_arg(ap, char**);
if (i < argc) { if (i < argc) {
ss = to_str(mrb, *sp++); ss = to_str(mrb, *sp++);
s = mrb_str_ptr(ss); s = mrb_str_ptr(ss);
if ((mrb_int)strlen(s->ptr) < s->len) { len = (mrb_int)strlen(s->ptr);
if (len < s->len) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL"); mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL");
} }
else if (len > s->len) {
mrb_str_modify(mrb, s);
}
*ps = s->ptr; *ps = s->ptr;
i++; i++;
} }
......
...@@ -62,6 +62,7 @@ mrb_str_modify(mrb_state *mrb, struct RString *s) ...@@ -62,6 +62,7 @@ mrb_str_modify(mrb_state *mrb, struct RString *s)
if (shared->refcnt == 1 && s->ptr == shared->ptr) { if (shared->refcnt == 1 && s->ptr == shared->ptr) {
s->ptr = shared->ptr; s->ptr = shared->ptr;
s->aux.capa = shared->len; s->aux.capa = shared->len;
s->ptr[s->len] = '\0';
mrb_free(mrb, shared); mrb_free(mrb, shared);
} }
else { else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment