Explicitly accept become_success in awaiting_prompt state

If we request escalation with a password, we start in expecting_prompt
state. If the escalation then succeeds without the password, i.e., the
become_success response arrives, we must explicitly move into the next
state (awaiting_escalation, which immediately goes into ready_to_send),
so that we no longer try to apply the timeout.

Otherwise, we would leak the success notification and eventually
timeout. But if the module response did arrive before the timeout
expired, the "process has already exited" test would do the right
thing by accident (which is why it didn't fail more often).

Fixes #13289
This commit is contained in:
Abhijit Menon-Sen 2015-11-25 21:07:17 +05:30 committed by James Cammarata
parent 54843d88ee
commit cac0eea291

View file

@ -457,12 +457,17 @@ class Connection(ConnectionBase):
tmp_stdout = tmp_stderr = '' tmp_stdout = tmp_stderr = ''
# If we see a privilege escalation prompt, we send the password. # If we see a privilege escalation prompt, we send the password.
# (If we're expecting a prompt but the escalation succeeds, we
# didn't need the password and can carry on regardless.)
if states[state] == 'awaiting_prompt' and self._flags['become_prompt']: if states[state] == 'awaiting_prompt':
display.debug('Sending become_pass in response to prompt') if self._flags['become_prompt']:
stdin.write(self._play_context.become_pass + '\n') display.debug('Sending become_pass in response to prompt')
self._flags['become_prompt'] = False stdin.write(self._play_context.become_pass + '\n')
state += 1 self._flags['become_prompt'] = False
state += 1
elif self._flags['become_success']:
state += 1
# We've requested escalation (with or without a password), now we # We've requested escalation (with or without a password), now we
# wait for an error message or a successful escalation. # wait for an error message or a successful escalation.