From b3f5fb37182a05a65f36256f79563e087fc4975d Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 19 Oct 2009 08:33:00 +0000 Subject: [PATCH] * spawn.cc (av::fixup): Treat non-readable, but executable files as Cygwin executables. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/spawn.cc | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4bf59b629..2f35b71ab 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2009-10-19 Corinna Vinschen + + * spawn.cc (av::fixup): Treat non-readable, but executable files as + Cygwin executables. + 2009-10-18 Corinna Vinschen * uinfo.cc (uinfo_init): Deimpersonate, don't reimpersonate, if diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index a6ac9f0e7..f4c208d09 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -1003,7 +1003,18 @@ av::fixup (const char *prog_arg, path_conv& real_path, const char *ext) | FILE_OPEN_FOR_BACKUP_INTENT | FILE_NON_DIRECTORY_FILE); if (!NT_SUCCESS (status)) - goto err; + { + /* File is not readable? Doesn't mean it's not executable. + Test for executablility and if so, just assume the file is + a cygwin executable and go ahead. */ + if (status == STATUS_ACCESS_DENIED && real_path.has_acls () + && check_file_access (real_path, X_OK, true) == 0) + { + real_path.set_cygexec (true); + break; + } + goto err; + } HANDLE hm = CreateFileMapping (h, &sec_none_nih, PAGE_READONLY, 0, 0, NULL); NtClose (h); -- 2.43.5