diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-08-06 10:46:31 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-08-06 10:50:42 +0200 |
commit | 98669a24760a84bfef498fedeef7fa7ecc518e6c (patch) | |
tree | 658a191e70a572a6a0f84be58805a35997765927 | |
parent | bf56973edc784e875a258ca5e7797423752f1a72 (diff) | |
download | cygnal-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.cc | 12 |
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); |