diff options
author | John Estabrook <jestabro@vyos.io> | 2021-02-17 15:25:54 -0600 |
---|---|---|
committer | John Estabrook <jestabro@vyos.io> | 2021-02-17 15:42:15 -0600 |
commit | 83bcd13775323bec35d018223029e9a8b13179c8 (patch) | |
tree | 9538f0a036fa7571e89adfbde91b126fcfb32fea | |
parent | 4cdfb1f0be743371cfb75e428742b252be4ff64f (diff) | |
download | vyos-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.py | 4 |
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 |