From 13e0f78798ee989f8cb8063a85a6d340aba1a0ec Mon Sep 17 00:00:00 2001 From: Joe Guo Date: Fri, 15 Sep 2017 16:13:26 +1200 Subject: [PATCH] python: use communicate to fix Popen deadlock `Popen.wait()` will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates large output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that. Signed-off-by: Joe Guo Reviewed-by: Douglas Bagnall Reviewed-by: Andrew Bartlett Autobuild-User(master): Andrew Bartlett Autobuild-Date(master): Thu Oct 19 09:27:16 CEST 2017 on sn-devel-144 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13127 (cherry picked from commit 5dc773a5b00834c7a53130a73a48f49048bd55e8) --- python/samba/tests/__init__.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/python/samba/tests/__init__.py b/python/samba/tests/__init__.py index 2c8fa192137..0f3f09e6db1 100644 --- a/python/samba/tests/__init__.py +++ b/python/samba/tests/__init__.py @@ -1119,20 +1119,22 @@ class BlackboxTestCase(TestCaseInTempDir): stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - retcode = p.wait() + stdoutdata, stderrdata = p.communicate() + retcode = p.returncode if retcode != expected: raise BlackboxProcessError(retcode, line, - p.stdout.read(), - p.stderr.read()) + stdoutdata, + stderrdata) def check_output(self, line): line = self._make_cmdline(line) p = subprocess.Popen(line, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, close_fds=True) - retcode = p.wait() + stdoutdata, stderrdata = p.communicate() + retcode = p.returncode if retcode: - raise BlackboxProcessError(retcode, line, p.stdout.read(), p.stderr.read()) - return p.stdout.read() + raise BlackboxProcessError(retcode, line, stdoutdata, stderrdata) + return stdoutdata def connect_samdb(samdb_url, lp=None, session_info=None, credentials=None,