diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2022-06-27 21:34:01 +0900 |
---|---|---|
committer | Takashi Yano <takashi.yano@nifty.ne.jp> | 2022-07-05 13:44:56 +0900 |
commit | fc74dbf22f5c72f023713e7bb8c934ce34589163 (patch) | |
tree | d820676d86776845be80c1f02a08ca48c812911a /winsup/cygwin/spawn.cc | |
parent | b3e25f0bc1bf69bde17b0a8004d9ed4755ebd18a (diff) | |
download | newlib-fc74dbf22f5c72f023713e7bb8c934ce34589163.zip newlib-fc74dbf22f5c72f023713e7bb8c934ce34589163.tar.gz newlib-fc74dbf22f5c72f023713e7bb8c934ce34589163.tar.bz2 |
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
Diffstat (limited to 'winsup/cygwin/spawn.cc')
-rw-r--r-- | winsup/cygwin/spawn.cc | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 8e70035..277f0d1 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -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. |