summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'string.c')
-rw-r--r--string.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/string.c b/string.c
index 43b8b4e007..be74fd8b72 100644
--- a/string.c
+++ b/string.c
@@ -4435,12 +4435,14 @@ rb_str_update(VALUE str, long beg, long len, VALUE val)
rb_raise(rb_eIndexError, "index %ld out of string", beg);
}
if (beg < 0) {
- if (-beg > slen) {
+ if (beg + slen < 0) {
goto out_of_range;
}
beg += slen;
}
- if (slen < len || slen < beg + len) {
+ assert(beg >= 0);
+ assert(beg <= slen);
+ if (len > slen - beg) {
len = slen - beg;
}
str_modify_keep_cr(str);