Currently when starting a process from bash via a native symlink, argv[0] is
set to the realpath of the executable and not to the link name. This patch fixes
it so the path of the symlink is seen instead.

The cause is a path conversion in perhaps_suffix which follows native
symlinks. Hence the fix this patch uses is to add PC_SYM_NOFOLLOW_REP when
calling path_conv::check to prevent that.

Fixes: 1fd5e000ace55 ("import winsup-2000-02-17 snapshot")
Signed-off-by: SquallATF <squall...@gmail.com>
---
 winsup/cygwin/spawn.cc | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 06b84236d..ef175e708 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -43,7 +43,9 @@ perhaps_suffix (const char *prog, path_conv& buf, int& err, 
unsigned opt)
 
   err = 0;
   debug_printf ("prog '%s'", prog);
-  buf.check (prog, PC_SYM_FOLLOW | PC_NULLEMPTY | PC_POSIX, stat_suffixes);
+  buf.check (prog,
+            PC_SYM_FOLLOW | PC_SYM_NOFOLLOW_REP | PC_NULLEMPTY | PC_POSIX,
+            stat_suffixes);
 
   if (buf.isdir ())
     {
-- 
2.48.1.windows.1



---- On Mon, 10 Mar 2025 19:15:08 +0000 Corinna Vinschen  wrote ---

 > Hi Chris, 
 >  
 > On Mar 10 15:46, Chris Denton wrote: 
 > > This upstreams the msys2 patch: 
 > > https://github.com/msys2/MSYS2-packages/blob/6a02000fd93c6b2001220507e5369a726b6381c4/msys2-runtime/0021-Fix-native-symbolic-link-spawn-passing-wrong-arg0.patch
 > >  
 > > 
 > > Original msys2 issue: 
 > > https://github.com/msys2/MSYS2-packages/issues/1327 
 >  
 > Sorry, but not like this. The commit message should describe the problem 
 > and the chosen solution, not just point to some external websites. 
 >  
 > It's also missing a Fixes: and a Signed-off-by: line, the latter ideally 
 > from the original author of the patch. 
 >  
 > > --- 
 > >  winsup/cygwin/spawn.cc | 2 +- 
 > >  1 file changed, 1 insertion(+), 1 deletion(-) 
 > > 
 > > diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc 
 > > index 06b84236d..b81ccefb7 100644 
 > > --- a/winsup/cygwin/spawn.cc 
 > > +++ b/winsup/cygwin/spawn.cc 
 > > @@ -43,7 +43,7 @@ perhaps_suffix (const char *prog, path_conv& buf, int& 
 > > err, unsigned opt) 
 > > 
 > >    err = 0; 
 > >    debug_printf ("prog '%s'", prog); 
 > > -  buf.check (prog, PC_SYM_FOLLOW | PC_NULLEMPTY | PC_POSIX, 
 > > stat_suffixes); 
 > > +  buf.check (prog, PC_SYM_FOLLOW | PC_SYM_NOFOLLOW_REP | PC_NULLEMPTY | 
 > > PC_POSIX, stat_suffixes); 
 >  
 > Formatting should try to stick to max. 80 chars per line, please. 
 >  
 >  
 > Thanks, 
 > Corinna 
 > 

Reply via email to