summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2021-02-17 15:25:54 -0600
committerJohn Estabrook <jestabro@vyos.io>2021-02-17 15:42:15 -0600
commit83bcd13775323bec35d018223029e9a8b13179c8 (patch)
tree9538f0a036fa7571e89adfbde91b126fcfb32fea
parent4cdfb1f0be743371cfb75e428742b252be4ff64f (diff)
downloadvyos-1x-83bcd13775323bec35d018223029e9a8b13179c8.tar.gz
vyos-1x-83bcd13775323bec35d018223029e9a8b13179c8.zip
configsession: T3259: avoid deadlock when data fills stdout pipe
If the subprocess is producing enough data (in this case showConfig on a large config file), then the construction: p = subprocess.Popen(.., stdout=subprocess.PIPE, ..) p.wait() will deadlock with the subprocess waiting for data to be consumed, while the Python process waits for its termination. So consume data, then wait for termination.
-rw-r--r--python/vyos/configsession.py4
1 files changed, 2 insertions, 2 deletions
diff --git a/python/vyos/configsession.py b/python/vyos/configsession.py
index 82b9355a3..670e6c7fc 100644
--- a/python/vyos/configsession.py
+++ b/python/vyos/configsession.py
@@ -129,9 +129,9 @@ class ConfigSession(object):
def __run_command(self, cmd_list):
p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=self.__session_env)
+ (stdout_data, stderr_data) = p.communicate()
+ output = stdout_data.decode()
result = p.wait()
- output = p.stdout.read().decode()
- p.communicate()
if result != 0:
raise ConfigSessionError(output)
return output