Fix a fatal error at startup on Windows due to non-ASCII characters in PATH.
authorEli Zaretskii <eliz@gnu.org>
Sat, 22 Jun 2013 13:16:56 +0000 (16:16 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 22 Jun 2013 13:16:56 +0000 (16:16 +0300)
 main.c (find_and_set_default_shell): Don't use file_exists_p or
 dir_file_exists_p, as those call readdir, which can fail if PATH
 includes directories with non-ASCII characters, and that would
 cause Make to fail at startup with confusing diagnostics.  See
 https://sourceforge.net/mailarchive/message.php?msg_id=30846737
 for the details.

ChangeLog
main.c

index fe7cd99f5786b55260fa985ab19ce3fe0cf0f788..c01a3233faf2155d8c15e073a2bea08d38779ed1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2013-06-22  Eli Zaretskii  <eliz@gnu.org>
+
+       * main.c (find_and_set_default_shell): Don't use file_exists_p or
+       dir_file_exists_p, as those call readdir, which can fail if PATH
+       includes directories with non-ASCII characters, and that would
+       cause Make to fail at startup with confusing diagnostics.  See
+       https://sourceforge.net/mailarchive/message.php?msg_id=30846737
+       for the details.
+
 2013-06-22  Paul Smith  <psmith@gnu.org>
 
        Improve performance by using a character map to determine where we
diff --git a/main.c b/main.c
index 147f77d768e12b615aff410529d8e9fce703fa03..fe8d3559626af336d8dcf7086f46cef0f28185d6 100644 (file)
--- a/main.c
+++ b/main.c
@@ -956,7 +956,7 @@ find_and_set_default_shell (const char *token)
       /* no new information, path already set or known */
       sh_found = 1;
     }
-  else if (file_exists_p (search_token))
+  else if (_access (search_token, 0) == 0)
     {
       /* search token path was found */
       sprintf (sh_path, "%s", search_token);
@@ -982,9 +982,9 @@ find_and_set_default_shell (const char *token)
             {
               *ep = '\0';
 
-              if (dir_file_exists_p (p, search_token))
+             sprintf (sh_path, "%s/%s", p, search_token);
+              if (_access (sh_path, 0) == 0)
                 {
-                  sprintf (sh_path, "%s/%s", p, search_token);
                   default_shell = xstrdup (w32ify (sh_path, 0));
                   sh_found = 1;
                   *ep = PATH_SEPARATOR_CHAR;
@@ -1002,12 +1002,15 @@ find_and_set_default_shell (const char *token)
             }
 
           /* be sure to check last element of Path */
-          if (p && *p && dir_file_exists_p (p, search_token))
-            {
-              sprintf (sh_path, "%s/%s", p, search_token);
-              default_shell = xstrdup (w32ify (sh_path, 0));
-              sh_found = 1;
-            }
+         if (p && *p)
+           {
+             sprintf (sh_path, "%s/%s", p, search_token);
+             if (_access (sh_path, 0) == 0)
+               {
+                 default_shell = xstrdup (w32ify (sh_path, 0));
+                 sh_found = 1;
+               }
+           }
 
           if (sh_found)
             DB (DB_VERBOSE,