diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-08-03 16:24:48 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-08-03 16:24:48 +0000 |
commit | d4132b8ae0e79f3fc21bad0fdba1a79fdd6c48b0 (patch) | |
tree | a6d30da2f33b0bc9c5c27adfdb99a031c4800b6a | |
parent | 3aefb61f15ca7d09f8465b7cc8036eec81d0830d (diff) |
merge revision(s) r46550: [Backport #9977]
* hash.c (ruby_setenv): fix memory leak on Windows, free
environment strings block after check for the size.
[ruby-dev:48323] [Bug #9977]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@47053 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | hash.c | 7 | ||||
-rw-r--r-- | test/ruby/test_env.rb | 10 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 22 insertions, 3 deletions
@@ -1,3 +1,9 @@ +Mon Aug 4 01:24:09 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * hash.c (ruby_setenv): fix memory leak on Windows, free + environment strings block after check for the size. + [ruby-dev:48323] [Bug #9977] + Mon Aug 4 01:11:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> * re.c (match_aref, rb_reg_regsub): consider encoding of captured @@ -2751,9 +2751,12 @@ ruby_setenv(const char *name, const char *value) int failed = 0; check_envname(name); if (value) { - const char* p = GetEnvironmentStringsA(); + char* p = GetEnvironmentStringsA(); + size_t n; if (!p) goto fail; /* never happen */ - if (strlen(name) + 2 + strlen(value) + getenvsize(p) >= getenvblocksize()) { + n = strlen(name) + 2 + strlen(value) + getenvsize(p); + FreeEnvironmentStringsA(p); + if (n >= getenvblocksize()) { goto fail; /* 2 for '=' & '\0' */ } buf = rb_sprintf("%s=%s", name, value); diff --git a/test/ruby/test_env.rb b/test/ruby/test_env.rb index 17c5d57d25..5eb6717405 100644 --- a/test/ruby/test_env.rb +++ b/test/ruby/test_env.rb @@ -1,4 +1,5 @@ require 'test/unit' +require_relative 'envutil' class TestEnv < Test::Unit::TestCase IGNORE_CASE = /bccwin|mswin|mingw/ =~ RUBY_PLATFORM @@ -408,4 +409,13 @@ class TestEnv < Test::Unit::TestCase keys.each {|k| ENV.delete(k)} end end + + def test_memory_leak_aset + bug9977 = '[ruby-dev:48323] [Bug #9977]' + assert_no_memory_leak([], <<-'end;', "5_000.times {ENV[k] = v}", bug9977) + ENV.clear + k = 'FOO' + v = (ENV[k] = 'bar'*5000 rescue 'bar'*1500) + end; + end end @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.1.2" #define RUBY_RELEASE_DATE "2014-08-04" -#define RUBY_PATCHLEVEL 191 +#define RUBY_PATCHLEVEL 192 #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 8 |