From b6e835c5487d49c1495ff9c500b3c5318b0c4156 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 4 Sep 2002 11:41:51 +0000 Subject: Backport: Fix for SF bug 601077 by Zack Weinberg. The new execvpe code would sometimes do the wrong thing when a non-executable file existed earlier in the path and an executable file of the same name existed later in the path. This patch restores the proper behavior (which is to execute the second file). When only a non-executable file exists, the correct error is still reported. --- Lib/os.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Lib/os.py b/Lib/os.py index 05f3682..bda12af 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -291,7 +291,7 @@ def execvp(file, args): _execvpe(file, args) def execvpe(file, args, env): - """execv(file, args, env) + """execvpe(file, args, env) Execute the executable file (which is searched for along $PATH) with argument list args and environment env , replacing the @@ -321,14 +321,21 @@ def _execvpe(file, args, env=None): else: envpath = defpath PATH = envpath.split(pathsep) + saved_exc = None + saved_tb = None for dir in PATH: fullname = path.join(dir, file) try: apply(func, (fullname,) + argrest) - except error, (errno, msg): - if errno != ENOENT and errno != ENOTDIR: - raise - raise error, (errno, msg) + except error, e: + tb = sys.exc_info()[2] + if (e.errno != ENOENT and e.errno != ENOTDIR + and saved_exc is None): + saved_exc = e + saved_tb = tb + if saved_exc: + raise error, saved_exc, saved_tb + raise error, e, tb # Change environ to automatically call putenv() if it exists try: -- cgit v0.12