Avoid losing data from events if multiple arrive at the same time. (#1158)

This commit is contained in:
Felix Fontein 2025-10-10 20:21:21 +02:00 committed by GitHub
parent e8ec22d3b1
commit f7e976f3da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 17 additions and 8 deletions

View File

@ -0,0 +1,3 @@
bugfixes:
- "docker, nsenter connection plugins - fix handling of ``become`` plugin password prompt handling in case multiple events arrive at the same time
(https://github.com/ansible-collections/community.docker/pull/1158)."

View File

@ -425,21 +425,24 @@ class Connection(ConnectionBase):
+ to_native(become_output) + to_native(become_output)
) )
chunk = None chunks = b""
for key, event in events: for key, event in events:
if key.fileobj == p.stdout: if key.fileobj == p.stdout:
chunk = p.stdout.read() chunk = p.stdout.read()
if chunk:
chunks += chunk
elif key.fileobj == p.stderr: elif key.fileobj == p.stderr:
chunk = p.stderr.read() chunk = p.stderr.read()
# TODO: avoid chunk being set multiple times! if chunk:
chunks += chunk
if not chunk: if not chunks:
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
raise AnsibleError( raise AnsibleError(
"privilege output closed while waiting for password prompt:\n" "privilege output closed while waiting for password prompt:\n"
+ to_native(become_output) + to_native(become_output)
) )
become_output += chunk become_output += chunks
finally: finally:
selector.close() selector.close()

View File

@ -177,21 +177,24 @@ class Connection(ConnectionBase):
+ to_native(become_output) + to_native(become_output)
) )
chunk = None chunks = b""
for key, event in events: for key, event in events:
if key.fileobj == p.stdout: if key.fileobj == p.stdout:
chunk = p.stdout.read() chunk = p.stdout.read()
if chunk:
chunks += chunk
elif key.fileobj == p.stderr: elif key.fileobj == p.stderr:
chunk = p.stderr.read() chunk = p.stderr.read()
# TODO: avoid chunk being set multiple times! if chunk:
chunks += chunk
if not chunk: if not chunks:
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
raise AnsibleError( raise AnsibleError(
"privilege output closed while waiting for password prompt:\n" "privilege output closed while waiting for password prompt:\n"
+ to_native(become_output) + to_native(become_output)
) )
become_output += chunk become_output += chunks
finally: finally:
selector.close() selector.close()