From 6d14c47c20455828b7945a15920a18c4eee13d42 Mon Sep 17 00:00:00 2001 From: kazu Date: Fri, 24 Nov 2017 11:00:10 +0000 Subject: [PATCH] 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 --- lib/irb/workspace.rb | 7 +++++-- 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|