From c069e5ff4003521181a336aace07d820de9aee31 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 25 Sep 2015 23:08:37 +0900 Subject: add boundary check to utf8len() to avoid oob memory access --- src/string.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'src/string.c') diff --git a/src/string.c b/src/string.c index 14290f4fc..fbded91c0 100644 --- a/src/string.c +++ b/src/string.c @@ -250,14 +250,13 @@ static const char utf8len_codepage[256] = }; static mrb_int -utf8len(unsigned char* p) +utf8len(const char* p, const char* e) { mrb_int len; mrb_int i; - if (*p == 0) - return 1; - len = utf8len_codepage[*p]; + len = utf8len_codepage[(unsigned char)*p]; + if (p + len > e) return 1; for (i = 1; i < len; ++i) if ((p[i] & 0xc0) != 0x80) return 1; @@ -268,11 +267,11 @@ static mrb_int utf8_strlen(mrb_value str, mrb_int len) { mrb_int total = 0; - unsigned char* p = (unsigned char*) RSTRING_PTR(str); - unsigned char* e = p; + char* p = RSTRING_PTR(str); + char* e = p; e += len < 0 ? RSTRING_LEN(str) : len; while (p= clen) return mrb_nil_value(); - pos = chars2bytes(RSTRING_PTR(str), pos); + pos = chars2bytes(str, 0, pos); switch (mrb_type(sub)) { default: { @@ -1738,7 +1739,7 @@ mrb_str_reverse_bang(mrb_state *mrb, mrb_value str) r = RSTRING_PTR(str) + len; while (p