USE subprocess.Popen API correctly.

When collecting stdout/stderr *and* feeding data into a Popen instance,
communicate() must be used to avoid a known deadlocking scenario
when data sizes cross PIPE_BUF (which can be as small as 512, although should
be much larger in practice on linux).
pull/4295/head
Brian Harring 11 years ago
parent 7ecb2b6728
commit 2174230315

@ -935,10 +935,9 @@ class AnsibleModule(object):
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE) stderr=subprocess.PIPE)
if data: if data:
cmd.stdin.write(data)
if not binary_data: if not binary_data:
cmd.stdin.write('\\n') data += '\\n'
out, err = cmd.communicate() out, err = cmd.communicate(input=data)
rc = cmd.returncode rc = cmd.returncode
except (OSError, IOError), e: except (OSError, IOError), e:
self.fail_json(rc=e.errno, msg=str(e), cmd=args) self.fail_json(rc=e.errno, msg=str(e), cmd=args)

Loading…
Cancel
Save