summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Martz <matt@sivel.net>2018-01-18 09:28:25 -0600
committerToshio Kuratomi <a.badger@gmail.com>2018-01-19 08:06:07 -0800
commitbd4b92c0b62f8c6f98d5b55e58f570c6f0886fed (patch)
tree41427822180deda4b63ef94be663badaee7698ed
parent95e162dc325c2ae11880a641ef4df3e1cc403868 (diff)
downloadansible-bd4b92c0b62f8c6f98d5b55e58f570c6f0886fed.tar.gz
Ensure that the become password is written on py3 in the ssh connection plugin. Fixes #34727
(cherry picked from commit 29c1d5cb5d283c649a5bc30dce53b8e4875d01d3)
-rw-r--r--lib/ansible/plugins/connection/ssh.py3
-rw-r--r--test/units/plugins/connection/test_ssh.py1
2 files changed, 4 insertions, 0 deletions
diff --git a/lib/ansible/plugins/connection/ssh.py b/lib/ansible/plugins/connection/ssh.py
index 845612eb92..85f4c6571d 100644
--- a/lib/ansible/plugins/connection/ssh.py
+++ b/lib/ansible/plugins/connection/ssh.py
@@ -758,6 +758,9 @@ class Connection(ConnectionBase):
if self._flags['become_prompt']:
display.debug('Sending become_pass in response to prompt')
stdin.write(to_bytes(self._play_context.become_pass) + b'\n')
+ # On python3 stdin is a BufferedWriter, and we don't have a guarantee
+ # that the write will happen without a flush
+ stdin.flush()
self._flags['become_prompt'] = False
state += 1
elif self._flags['become_success']:
diff --git a/test/units/plugins/connection/test_ssh.py b/test/units/plugins/connection/test_ssh.py
index 2ca4d93a8e..092ad70008 100644
--- a/test/units/plugins/connection/test_ssh.py
+++ b/test/units/plugins/connection/test_ssh.py
@@ -457,6 +457,7 @@ class TestSSHConnectionRun(object):
self.mock_selector.get_map.side_effect = lambda: True
return_code, b_stdout, b_stderr = self.conn._run("ssh", "this is input data")
+ self.mock_popen_res.stdin.flush.assert_called_once_with()
assert return_code == 0
assert b_stdout == b'abc'
assert b_stderr == b'123'