aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-09-13 08:12:54 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-09-13 08:12:54 +0000
commit9be80649453d30dd9c010af2ee1132753b4417dc (patch)
treea686204b200573b84a0379263861069a216ee8c6
parentc49e0df2d7b3b69e3d7ce2ef8a277915b3e3c84c (diff)
downloadruby-9be80649453d30dd9c010af2ee1132753b4417dc.tar.gz
string.c: fix integer overflow
* string.c (rb_str_change_terminator_length): fix integer overflow in the case growing the terminator length and the string length is around LONG_MAX. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56149 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--string.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/string.c b/string.c
index 4197a17..450a559 100644
--- a/string.c
+++ b/string.c
@@ -2054,7 +2054,8 @@ rb_str_change_terminator_length(VALUE str, const int oldtermlen, const int terml
long capa = str_capacity(str, oldtermlen);
long len = RSTRING_LEN(str);
- if (capa < len + termlen - oldtermlen) {
+ assert(capa >= len);
+ if (capa - len < termlen - oldtermlen) {
rb_check_lockedtmp(str);
str_make_independent_expand(str, len, 0L, termlen);
}