aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2020-07-23 11:16:31 +0900
committernagachika <nagachika@ruby-lang.org>2020-07-23 11:16:31 +0900
commit13d2ab0d88bbf72ed310efaec6edc46dd96fdb4d (patch)
treeadc31b2d36e636e9e977ba9007a05a39aff0d341
parentcc39480cf9f2767967b6bcc69ccb3c201e5b2231 (diff)
downloadruby-13d2ab0d88bbf72ed310efaec6edc46dd96fdb4d.tar.gz
merge revision(s) 2ecfb88ee50510955acd3ae9fc94a5f109e7f109: [Backport #16918]
Correctly remove temporary directory if path yielded is mutated Another approach would be to freeze the string, but that could cause backwards compatibility issues. Fixes [Bug #16918]
-rw-r--r--lib/tmpdir.rb2
-rw-r--r--test/test_tmpdir.rb11
-rw-r--r--version.h2
3 files changed, 13 insertions, 2 deletions
diff --git a/lib/tmpdir.rb b/lib/tmpdir.rb
index ea1d380ef1..1bbf7ea46a 100644
--- a/lib/tmpdir.rb
+++ b/lib/tmpdir.rb
@@ -86,7 +86,7 @@ class Dir
}
if block_given?
begin
- yield path
+ yield path.dup
ensure
unless base
stat = File.stat(File.dirname(path))
diff --git a/test/test_tmpdir.rb b/test/test_tmpdir.rb
index c599dcf516..50583b5ce1 100644
--- a/test/test_tmpdir.rb
+++ b/test/test_tmpdir.rb
@@ -52,6 +52,17 @@ class TestTmpdir < Test::Unit::TestCase
}
end
+ def test_mktmpdir_mutate
+ bug16918 = '[ruby-core:98563]'
+ assert_nothing_raised(bug16918) do
+ assert_mktmpdir_traversal do |traversal_path|
+ Dir.mktmpdir(traversal_path + 'foo') do |actual|
+ actual << "foo"
+ end
+ end
+ end
+ end
+
def test_mktmpdir_traversal
assert_mktmpdir_traversal do |traversal_path|
Dir.mktmpdir(traversal_path + 'foo') do |actual|
diff --git a/version.h b/version.h
index bbb9fc4a45..7ff1cd9db2 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 1
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 98
+#define RUBY_PATCHLEVEL 99
#define RUBY_RELEASE_YEAR 2020
#define RUBY_RELEASE_MONTH 7