From e1b3431cef4873b2853199f4b5114de7e26de998 Mon Sep 17 00:00:00 2001 From: Martin Panter Date: Tue, 14 Jun 2016 04:08:30 +0000 Subject: [PATCH] Issue #22636: Handle OSError from subprocess, e.g. if command not found --- Lib/ctypes/util.py | 54 ++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 0b96e5953e4..7684eab81db 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -115,10 +115,13 @@ elif os.name == "posix": env = dict(os.environ) env['LC_ALL'] = 'C' env['LANG'] = 'C' - proc = subprocess.Popen(args, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - env=env) + try: + proc = subprocess.Popen(args, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + env=env) + except OSError: # E.g. bad executable + return None with proc: trace = proc.stdout.read() finally: @@ -140,9 +143,12 @@ elif os.name == "posix": if not f: return None - proc = subprocess.Popen(("/usr/ccs/bin/dump", "-Lpv", f), - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL) + try: + proc = subprocess.Popen(("/usr/ccs/bin/dump", "-Lpv", f), + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) + except OSError: # E.g. command not found + return None with proc: data = proc.stdout.read() res = re.search(br'\[.*\]\sSONAME\s+([^\s]+)', data) @@ -159,9 +165,12 @@ elif os.name == "posix": # objdump is not available, give up return None - proc = subprocess.Popen((objdump, '-p', '-j', '.dynamic', f), - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL) + try: + proc = subprocess.Popen((objdump, '-p', '-j', '.dynamic', f), + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) + except OSError: # E.g. bad executable + return None with proc: dump = proc.stdout.read() res = re.search(br'\sSONAME\s+([^\s]+)', dump) @@ -187,11 +196,15 @@ elif os.name == "posix": expr = r':-l%s\.\S+ => \S*/(lib%s\.\S+)' % (ename, ename) expr = os.fsencode(expr) - proc = subprocess.Popen(('/sbin/ldconfig', '-r'), - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL) - with proc: - data = proc.stdout.read() + try: + proc = subprocess.Popen(('/sbin/ldconfig', '-r'), + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) + except OSError: # E.g. command not found + data = b'' + else: + with proc: + data = proc.stdout.read() res = re.findall(expr, data) if not res: @@ -214,10 +227,13 @@ elif os.name == "posix": args = ('/usr/bin/crle',) paths = None - proc = subprocess.Popen(args, - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - env=env) + try: + proc = subprocess.Popen(args, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + env=env) + except OSError: # E.g. bad executable + return None with proc: for line in proc.stdout: line = line.strip()