Fix garbage detection within SSH communicator

Fixes #10552
This commit is contained in:
Chris Roberts 2019-01-07 16:19:14 -08:00
parent 05dcac11cc
commit d87c645bd0
2 changed files with 47 additions and 3 deletions

View File

@ -573,14 +573,14 @@ module VagrantPlugins
stderr_data_buffer << data
marker_index = stderr_data_buffer.index(CMD_GARBAGE_MARKER)
if marker_index
marker_found = true
stderr_marker_found = true
stderr_data_buffer.slice!(0, marker_index + CMD_GARBAGE_MARKER.size)
data.replace(stderr_data_buffer)
data_buffer = nil
stderr_data_buffer = nil
end
end
if block_given? && marker_found && !data.empty?
if block_given? && stderr_marker_found && !data.empty?
yield :stderr, data
end
end

View File

@ -321,6 +321,7 @@ describe VagrantPlugins::CommunicatorSSH::Communicator do
let(:command_stdout_data) do
"Line of garbage\nMore garbage\n#{command_garbage_marker}bin\ntmp\n"
end
let(:command_stderr_data) { "some data" }
it "removes any garbage output prepended to command output" do
stdout = ''
@ -333,12 +334,23 @@ describe VagrantPlugins::CommunicatorSSH::Communicator do
).to eq(0)
expect(stdout).to eq("bin\ntmp\n")
end
it "should not receive any stderr data" do
stderr = ''
communicator.execute("ls /") do |type, data|
if type == :stderr
stderr << data
end
end
expect(stderr).to be_empty
end
end
context "with no command output" do
let(:command_stdout_data) do
"#{command_garbage_marker}"
end
let(:command_stderr_data) { "some data" }
it "does not send empty stdout data string" do
empty = true
@ -351,12 +363,23 @@ describe VagrantPlugins::CommunicatorSSH::Communicator do
).to eq(0)
expect(empty).to be(true)
end
it "should not receive any stderr data" do
stderr = ''
communicator.execute("ls /") do |type, data|
if type == :stderr
stderr << data
end
end
expect(stderr).to be_empty
end
end
context "with garbage content prepended to command stderr output" do
let(:command_stderr_data) do
"Line of garbage\nMore garbage\n#{command_garbage_marker}bin\ntmp\n"
end
let(:command_stdout_data) { "some data" }
it "removes any garbage output prepended to command stderr output" do
stderr = ''
@ -369,12 +392,23 @@ describe VagrantPlugins::CommunicatorSSH::Communicator do
).to eq(0)
expect(stderr).to eq("bin\ntmp\n")
end
it "should not receive any stdout data" do
stdout = ''
communicator.execute("ls /") do |type, data|
if type == :stdout
stdout << data
end
end
expect(stdout).to be_empty
end
end
context "with no command output on stderr" do
let(:command_stderr_data) do
"#{command_garbage_marker}"
end
let(:command_std_data) { "some data" }
it "does not send empty stderr data string" do
empty = true
@ -387,6 +421,16 @@ describe VagrantPlugins::CommunicatorSSH::Communicator do
).to eq(0)
expect(empty).to be(true)
end
it "should not receive any stdout data" do
stdout = ''
communicator.execute("ls /") do |type, data|
if type == :stdout
stdout << data
end
end
expect(stdout).to be_empty
end
end
context "with pty enabled" do