summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-08-03 16:24:48 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-08-03 16:24:48 +0000
commitd4132b8ae0e79f3fc21bad0fdba1a79fdd6c48b0 (patch)
treea6d30da2f33b0bc9c5c27adfdb99a031c4800b6a
parent3aefb61f15ca7d09f8465b7cc8036eec81d0830d (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--ChangeLog6
-rw-r--r--hash.c7
-rw-r--r--test/ruby/test_env.rb10
-rw-r--r--version.h2
4 files changed, 22 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 40b21f186c..376e29ec62 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/hash.c b/hash.c
index 9a5814aad4..723b460701 100644
--- a/hash.c
+++ b/hash.c
@@ -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
diff --git a/version.h b/version.h
index bf5c6dc604..e314010659 100644
--- a/version.h
+++ b/version.h
@@ -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