diff options
author | kazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-24 11:00:10 +0000 |
---|---|---|
committer | kazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-24 11:00:10 +0000 |
commit | 6d14c47c20455828b7945a15920a18c4eee13d42 (patch) | |
tree | b4b4f63c63523034ceaafc67c4bbf33c3f01a6bf | |
parent | dff3d5dc6943ff7f72882bb3f3349737d7b8e3a8 (diff) | |
download | ruby-6d14c47c20455828b7945a15920a18c4eee13d42.tar.gz |
Fix TOCTTOU and avoid to read existing unreadable file
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60900 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | lib/irb/workspace.rb | 7 | ||||
-rw-r--r-- | test/irb/test_workspace.rb | 13 |
2 files changed, 18 insertions, 2 deletions
diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb index aa28db5502..9ce84b60fa 100644 --- a/lib/irb/workspace.rb +++ b/lib/irb/workspace.rb @@ -111,8 +111,11 @@ EOF file, pos = @binding.eval('[__FILE__, __LINE__]') unless defined?(::SCRIPT_LINES__[file]) && lines = ::SCRIPT_LINES__[file] - return unless File.exist?(file) - lines = File.readlines(file) + begin + lines = File.readlines(file) + rescue SystemCallError + return + end end pos -= 1 diff --git a/test/irb/test_workspace.rb b/test/irb/test_workspace.rb index ce4c86d20b..970dc7fd14 100644 --- a/test/irb/test_workspace.rb +++ b/test/irb/test_workspace.rb @@ -32,6 +32,19 @@ module TestIRB end end + def test_code_around_binding_with_existing_unreadable_file + Tempfile.create do |f| + code = "IRB::WorkSpace.new(binding)\n" + f.print(code) + f.close + + File.chmod(0, f.path) + + workspace = eval(code, binding, f.path) + assert_equal(nil, workspace.code_around_binding) + end + end + def test_code_around_binding_with_script_lines__ with_script_lines do |script_lines| Tempfile.create do |f| |