summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglass <glass@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-28 10:55:37 +0000
committerglass <glass@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-28 10:55:37 +0000
commitb3c70d4c7ed12ce3fea1746fbde922c61519177f (patch)
tree876e53aa47ad4a575ee503dbe93289bb5a2582da
parentc5da5b1ea27ec693dd09e9d586e913da1d5ba4b6 (diff)
string.c: fix potential bug in String#split
* string.c (rb_str_split_m): fix potential bug when rb_memsearch() matches a octet in the middle of a multi-byte character sequence. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59673 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--string.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/string.c b/string.c
index 8461ceb8b5..756a60f0ac 100644
--- a/string.c
+++ b/string.c
@@ -7469,7 +7469,8 @@ rb_str_split_m(int argc, VALUE *argv, VALUE str)
}
else if (split_type == string) {
char *ptr = RSTRING_PTR(str);
- char *temp = ptr;
+ char *str_start = ptr;
+ char *substr_start = ptr;
char *eptr = RSTRING_END(str);
char *sptr = RSTRING_PTR(spat);
long slen = RSTRING_LEN(spat);
@@ -7484,11 +7485,13 @@ rb_str_split_m(int argc, VALUE *argv, VALUE str)
ptr = t;
continue;
}
- rb_ary_push(result, rb_str_subseq(str, ptr - temp, end));
+ rb_ary_push(result, rb_str_subseq(str, substr_start - str_start,
+ (ptr+end) - substr_start));
ptr += end + slen;
+ substr_start = ptr;
if (!NIL_P(limit) && lim <= ++i) break;
}
- beg = ptr - temp;
+ beg = ptr - str_start;
}
else {
char *ptr = RSTRING_PTR(str);