[Python-checkins] python/dist/src/Lib os.py,1.47.4.1,1.47.4.2

gvanrossum@users.sourceforge.net gvanrossum@users.sourceforge.net
Wed, 04 Sep 2002 04:41:54 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv32384

Modified Files:
      Tag: release21-maint
	os.py 
Log Message:
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.


Index: os.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/os.py,v
retrieving revision 1.47.4.1
retrieving revision 1.47.4.2
diff -C2 -d -r1.47.4.1 -r1.47.4.2
*** os.py	8 Aug 2002 19:46:52 -0000	1.47.4.1
--- os.py	4 Sep 2002 11:41:51 -0000	1.47.4.2
***************
*** 292,296 ****
  
  def execvpe(file, args, env):
!     """execv(file, args, env)
  
      Execute the executable file (which is searched for along $PATH)
--- 292,296 ----
  
  def execvpe(file, args, env):
!     """execvpe(file, args, env)
  
      Execute the executable file (which is searched for along $PATH)
***************
*** 322,333 ****
          envpath = defpath
      PATH = envpath.split(pathsep)
      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)
  
  # Change environ to automatically call putenv() if it exists
--- 322,340 ----
          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, 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