diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-06-21 07:38:16 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-06-21 07:38:16 +0000 |
commit | 36727472ee0f7ef023a00830f7354c8474b5dcf3 (patch) | |
tree | cfb7d1981564e332457f9e187f07794e2a37c798 | |
parent | 07b08dcee68ebc63ff7d5a26ed2666c38d6d034e (diff) | |
download | ruby-36727472ee0f7ef023a00830f7354c8474b5dcf3.tar.gz |
Fix garbage allocation
* string.c (rb_str_casemap): do not put code with side effects
inside RSTRING_PTR() macro which evaluates the argument multiple
times.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55481 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | string.c | 6 |
2 files changed, 10 insertions, 2 deletions
@@ -1,3 +1,9 @@ +Tue Jun 21 16:38:14 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * string.c (rb_str_casemap): do not put code with side effects + inside RSTRING_PTR() macro which evaluates the argument multiple + times. + Tue Jun 21 16:13:45 2016 NARUSE, Yui <naruse@ruby-lang.org> * string.c (rb_str_casemap): fix memory leak. @@ -5811,12 +5811,14 @@ rb_str_casemap(VALUE source, OnigCaseFoldType *flags, rb_encoding *enc) if (buffer_count==1) { target = rb_str_new_with_class(source, (const char*)current_buffer->space, target_length); - xfree(current_buffer); + xfree(current_buffer); } else { - char *target_current = RSTRING_PTR(target = rb_str_new_with_class(source, 0, target_length)); + char *target_current; mapping_buffer *previous_buffer; + target = rb_str_new_with_class(source, 0, target_length); + target_current = RSTRING_PTR(target); current_buffer=pre_buffer.next; while (current_buffer) { memcpy(target_current, current_buffer->space, current_buffer->used); |