Commit 98669a24 authored by Corinna Vinschen's avatar Corinna Vinschen

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: default avatarCorinna Vinschen <corinna@vinschen.de>
parent bf56973e
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment