From: Michael Prokop Date: Tue, 15 Oct 2019 10:07:07 +0000 (+0200) Subject: Avoid subprocess.Popen with stdout/stderr=PIPE and wait() usage X-Git-Tag: v0.16.7~3^2 X-Git-Url: http://git.grml.org/?p=grml2usb.git;a=commitdiff_plain;h=29d54d4a9505cf92bae9fc4ba24b6253bdadedc9;hp=dbbca970b2878bdb1882a83a5ab30d97727d2590 Avoid subprocess.Popen with stdout/stderr=PIPE and wait() usage Quoting from https://docs.python.org/2/library/subprocess.html#popen-objects: | Popen.wait() | Wait for child process to terminate. Set and return returncode attribute. | | Warning | This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child | process generates enough output to a pipe such that it blocks waiting for the | OS pipe buffer to accept more data. Use communicate() to avoid that. While modprobe isn't expected to ever output enough output to be relevant, let's better be safe than sorry. While at it fix typo (it's -> its) Closes grml/grml2usb#21 --- diff --git a/grml2usb b/grml2usb index 9c6c8c5..c139f72 100755 --- a/grml2usb +++ b/grml2usb @@ -1855,14 +1855,14 @@ def check_programs(): def load_loop(): - """Runs modprobe loop and throws away it's output""" + """Runs modprobe loop and throws away its output""" if not which("modprobe"): logging.critical("Fatal: modprobe not available, can not continue - sorry.") logging.critical("Hint: is /sbin missing in PATH?") sys.exit(1) proc = subprocess.Popen(["modprobe", "loop"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - proc.wait() + proc.communicate() def main():