From aad254180a12abc1847a1f0c52a43d947e301031 Mon Sep 17 00:00:00 2001 From: Matt Wrock Date: Fri, 11 Sep 2015 14:53:13 -0700 Subject: have failing test --- spec/mixlib/shellout/windows_spec.rb | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/spec/mixlib/shellout/windows_spec.rb b/spec/mixlib/shellout/windows_spec.rb index d3fb26b..118be75 100644 --- a/spec/mixlib/shellout/windows_spec.rb +++ b/spec/mixlib/shellout/windows_spec.rb @@ -159,6 +159,35 @@ describe 'Mixlib::ShellOut::Windows', :windows_only do end end + context 'with extensionless executable' do + let(:stubbed_shell_out) { shell_out } + let(:executable_path) { 'C:\Windows\system32/ping.EXE' } + let(:cmd) { 'ping' } + + before do + allow(ENV).to receive(:[]).with('PATH').and_return('C:\Windows\system32') + allow(ENV).to receive(:[]).with('PATHEXT').and_return('.EXE') + allow(ENV).to receive(:[]).with('COMSPEC').and_return('C:\Windows\system32\cmd.exe') + allow(File).to receive(:executable?).and_return(false) + allow(File).to receive(:executable?).with(executable_path).and_return(true) + end + + it 'should return with full path with extension' do + is_expected.to eql([executable_path, cmd]) + end + + context 'there is a directory named after command' do + before do + # File.executable? returns true for directories + allow(File).to receive(:executable?).with(cmd).and_return(true) + end + + it 'should return with full path with extension' do + is_expected.to eql([executable_path, cmd]) + end + end + end + context 'with batch files' do let(:stubbed_shell_out) { shell_out.tap(&with_valid_exe_at_location) } let(:cmd_invocation) { "cmd /c \"#{cmd}\"" } -- cgit v1.2.1 From 8446b81929d3a1c3ef2dd24d5d93802add1791dc Mon Sep 17 00:00:00 2001 From: Matt Wrock Date: Fri, 11 Sep 2015 15:04:02 -0700 Subject: prevent shellout from attempting to execute a directory on windows --- lib/mixlib/shellout/windows.rb | 8 ++++++-- spec/mixlib/shellout/windows_spec.rb | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/mixlib/shellout/windows.rb b/lib/mixlib/shellout/windows.rb index bcda96a..6003ae8 100644 --- a/lib/mixlib/shellout/windows.rb +++ b/lib/mixlib/shellout/windows.rb @@ -301,14 +301,18 @@ module Mixlib # The OS will search through valid the extensions and look # for a binary there. def self.find_executable(path) - return path if File.executable? path + return path if executable? path pathext.each do |ext| exe = "#{path}#{ext}" - return exe if File.executable? exe + return exe if executable? exe end return nil end + + def self.executable?(path) + File.executable?(path) && !File.directory?(path) + end end end # class end diff --git a/spec/mixlib/shellout/windows_spec.rb b/spec/mixlib/shellout/windows_spec.rb index 118be75..dd8a80b 100644 --- a/spec/mixlib/shellout/windows_spec.rb +++ b/spec/mixlib/shellout/windows_spec.rb @@ -170,6 +170,7 @@ describe 'Mixlib::ShellOut::Windows', :windows_only do allow(ENV).to receive(:[]).with('COMSPEC').and_return('C:\Windows\system32\cmd.exe') allow(File).to receive(:executable?).and_return(false) allow(File).to receive(:executable?).with(executable_path).and_return(true) + allow(File).to receive(:directory?).and_return(false) end it 'should return with full path with extension' do @@ -180,6 +181,7 @@ describe 'Mixlib::ShellOut::Windows', :windows_only do before do # File.executable? returns true for directories allow(File).to receive(:executable?).with(cmd).and_return(true) + allow(File).to receive(:directory?).with(cmd).and_return(true) end it 'should return with full path with extension' do -- cgit v1.2.1