summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-08-06 10:46:31 +0200
committerCorinna Vinschen <corinna@vinschen.de>2019-08-06 10:50:42 +0200
commit98669a24760a84bfef498fedeef7fa7ecc518e6c (patch)
tree658a191e70a572a6a0f84be58805a35997765927
parentbf56973edc784e875a258ca5e7797423752f1a72 (diff)
downloadcygnal-98669a24760a84bfef498fedeef7fa7ecc518e6c.tar.gz
cygnal-98669a24760a84bfef498fedeef7fa7ecc518e6c.tar.bz2
cygnal-98669a24760a84bfef498fedeef7fa7ecc518e6c.zip
Cygwin: exec: check execute bit prior to evaluating script
When the exec family of functions is called for a script-like file, the av::setup function handles the exec[vl]p case as well. The execve case for files not starting with a she-bang is handled first by returning ENOEXEC. Only after that, the file's executability is checked. This leads to the problem that ENOEXEC is returned for non-executable files as well. A calling shell interprets this as a file it should try to run as script. This is not desired for non-executable files. Fix this problem by checking the file for executability first. Only after that, follow the other potential code paths. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/spawn.cc12
1 files changed, 6 insertions, 6 deletions
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 7f7af4449..d95772802 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -1172,6 +1172,12 @@ av::setup (const char *prog_arg, path_conv& real_path, const char *ext,
}
UnmapViewOfFile (buf);
just_shell:
+ /* Check if script is executable. Otherwise we start non-executable
+ scripts successfully, which is incorrect behaviour. */
+ if (real_path.has_acls ()
+ && check_file_access (real_path, X_OK, true) < 0)
+ return -1; /* errno is already set. */
+
if (!pgm)
{
if (!p_type_exec)
@@ -1188,12 +1194,6 @@ av::setup (const char *prog_arg, path_conv& real_path, const char *ext,
arg1 = NULL;
}
- /* Check if script is executable. Otherwise we start non-executable
- scripts successfully, which is incorrect behaviour. */
- if (real_path.has_acls ()
- && check_file_access (real_path, X_OK, true) < 0)
- return -1; /* errno is already set. */
-
/* Replace argv[0] with the full path to the script if this is the
first time through the loop. */
replace0_maybe (prog_arg);