From d6bb3f330dfc6c522531f1e227184feb31425a77 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 22 Jun 2009 15:40:59 +0000 Subject: [PATCH] * spawn.cc (spawn_guts): Don't run additional check for Win32 incompatible CWD if newargv.fixup bailed out already. (av::fixup): Check shell scripts for executability. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/spawn.cc | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 3bee988c1..ea3ab2ade 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2009-06-22 Corinna Vinschen + + * spawn.cc (spawn_guts): Don't run additional check for Win32 + incompatible CWD if newargv.fixup bailed out already. + (av::fixup): Check shell scripts for executability. + 2009-06-18 Corinna Vinschen * path.cc (chdir): Check error conditions first. diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index a95727880..be3c66a6a 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -357,6 +357,9 @@ spawn_guts (const char *prog_arg, const char *const *argv, wascygexec = real_path.iscygexec (); res = newargv.fixup (prog_arg, real_path, ext); + if (res) + goto out; + if (!real_path.iscygexec () && (cygheap->cwd.drive_length == 0 || cygheap->cwd.win32.Length >= MAX_PATH * sizeof (WCHAR))) @@ -372,9 +375,6 @@ spawn_guts (const char *prog_arg, const char *const *argv, goto out; } - if (res) - goto out; - if (ac == 3 && argv[1][0] == '/' && argv[1][1] == 'c' && (iscmd (argv[0], "command.com") || iscmd (argv[0], "cmd.exe"))) { @@ -1078,6 +1078,11 @@ just_shell: arg1 = NULL; } + /* Check if script is executable. Otherwise we start non-executable + scripts successfully, which is incorrect behaviour. */ + if (check_file_access (real_path, X_OK) < 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);