diff options
Diffstat (limited to 'src/string.c')
| -rw-r--r-- | src/string.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/src/string.c b/src/string.c index d34256e63..d474f6f96 100644 --- a/src/string.c +++ b/src/string.c @@ -167,7 +167,7 @@ mrb_str_buf_new(mrb_state *mrb, int capa) } static void -str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, mrb_int len) +str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, size_t len) { mrb_int capa; mrb_int total; @@ -202,7 +202,7 @@ str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, mrb_int len) } mrb_value -mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, mrb_int len) +mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len) { if (len == 0) return str; str_buf_cat(mrb, mrb_str_ptr(str), ptr, len); @@ -210,14 +210,10 @@ mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, mrb_int len) } mrb_value -mrb_str_new(mrb_state *mrb, const char *p, mrb_int len) +mrb_str_new(mrb_state *mrb, const char *p, size_t len) { struct RString *s; - if (len < 0) { - len = 0; - } - s = str_new(mrb, p, len); return mrb_obj_value(s); } @@ -237,8 +233,8 @@ mrb_str_new_cstr(mrb_state *mrb, const char *p) if (p) { len = strlen(p); - if (len > MRB_INT_MAX) { - len = MRB_INT_MAX; + if ((mrb_int)len < 0) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big"); } } else { @@ -563,8 +559,7 @@ str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2) { const size_t len = RSTRING_LEN(str1); - /* PARANOID: assert(SIZE_MAX >= MRB_INT_MAX) */ - + /* assert(SIZE_MAX >= MRB_INT_MAX) */ if (len != RSTRING_LEN(str2)) return FALSE; if (memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len) == 0) return TRUE; @@ -2055,6 +2050,7 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) char *end; char sign = 1; int c; + unsigned int n; mrb_int val; #undef ISDIGIT @@ -2159,8 +2155,11 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck) return mrb_fixnum_value(0); } - val = strtoul((char*)str, &end, base); - + n = strtoul((char*)str, &end, base); + if (n > MRB_INT_MAX) { + mrb_raisef(mrb, E_ARGUMENT_ERROR, "string (%s) too big for integer", str); + } + val = n; if (badcheck) { if (end == str) goto bad; /* no number */ while (*end && ISSPACE(*end)) end++; @@ -2551,14 +2550,7 @@ mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, mrb_int len) mrb_value mrb_str_cat2(mrb_state *mrb, mrb_value str, const char *ptr) { - size_t len; - - len = strlen(ptr); - if (len > MRB_INT_MAX) { - len = MRB_INT_MAX; - } - - return mrb_str_cat(mrb, str, ptr, len); + return mrb_str_cat(mrb, str, ptr, strlen(ptr)); } mrb_value |
