]> granicus.if.org Git - python/commitdiff
Issue #22636: Handle OSError from subprocess, e.g. if command not found
authorMartin Panter <vadmium+py@gmail.com>
Tue, 14 Jun 2016 04:08:30 +0000 (04:08 +0000)
committerMartin Panter <vadmium+py@gmail.com>
Tue, 14 Jun 2016 04:08:30 +0000 (04:08 +0000)
Lib/ctypes/util.py

index 0b96e5953e428c27e5e2b745c4bae6bc704d5683..7684eab81db47ecff3fe58afec6572bd6eb62d52 100644 (file)
@@ -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()