Cygwin: spawn: Treat empty path as the current directory.

- With this patch, the empty path (empty element in PATH or PATH is
  absent) is treated as the current directory as Linux does. This
  feature is added for Linux compatibility, but it is deprecated.
  POSIX notes that a conforming application shall use an explicit
  pathname to specify the current working directory.
Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251730.html
This commit is contained in:
Takashi Yano 2022-06-27 21:34:01 +09:00
parent b3e25f0bc1
commit fc74dbf22f
2 changed files with 23 additions and 2 deletions

View File

@ -21,6 +21,10 @@ What changed:
This aligns Cygwin behavior to that of Linux.
Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251672.html
- Treat an empty path (empty element in PATH or PATH is absent) as
the current directory as Linux does.
Addresses: https://cygwin.com/pipermail/cygwin/2022-June/251730.html
Bug Fixes
---------

View File

@ -95,6 +95,7 @@ find_exec (const char *name, path_conv& buf, const char *search,
char *tmp = tp.c_get ();
bool has_slash = !!strpbrk (name, "/\\");
int err = 0;
bool eopath = false;
debug_printf ("find_exec (%s)", name);
@ -118,8 +119,14 @@ find_exec (const char *name, path_conv& buf, const char *search,
the name of an environment variable. */
if (strchr (search, '/'))
*stpncpy (tmp, search, NT_MAX_PATH - 1) = '\0';
else if (has_slash || isdrive (name) || !(path = getenv (search)) || !*path)
else if (has_slash || isdrive (name))
goto errout;
/* Search the current directory when PATH is absent. This feature is
added for Linux compatibility, but it is deprecated. POSIX notes
that a conforming application shall use an explicit path name to
specify the current working directory. */
else if (!(path = getenv (search)) || !*path)
strcpy (tmp, ".");
else
*stpncpy (tmp, path, NT_MAX_PATH - 1) = '\0';
@ -130,11 +137,21 @@ find_exec (const char *name, path_conv& buf, const char *search,
do
{
char *eotmp = strccpy (tmp_path, &path, ':');
if (*path)
path++;
else
eopath = true;
/* An empty path or '.' means the current directory, but we've
already tried that. */
if ((opt & FE_CWD) && (tmp_path[0] == '\0'
|| (tmp_path[0] == '.' && tmp_path[1] == '\0')))
continue;
/* An empty path means the current directory. This feature is
added for Linux compatibility, but it is deprecated. POSIX
notes that a conforming application shall use an explicit
pathname to specify the current working directory. */
else if (tmp_path[0] == '\0')
eotmp = stpcpy (tmp_path, ".");
*eotmp++ = '/';
stpcpy (eotmp, name);
@ -155,7 +172,7 @@ find_exec (const char *name, path_conv& buf, const char *search,
}
}
while (*path && *++path);
while (!eopath);
errout:
/* Couldn't find anything in the given path.