From 70d0243ce9d627f9aa79b3eccbf0747347ba7b1a Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Thu, 8 Sep 2005 00:57:12 +0000 Subject: [PATCH] * hookapi.cc (rvadelta): Change argument to DWORD to eliminate a compiler warning. * path.h (path_conv::set_cygexec): New function. * spawn.cc (av::iscygwin): Eliminate. (av::av): Don't initialize iscygwin. (spawn_guts): Just use real_path.iscygexec for all tests. (av::fixup): Short circuit test if .exe extension and known cygexec. Set cygexec flag appropriately if we find that program uses cygwin1.dll. --- winsup/cygwin/ChangeLog | 12 ++++++++++++ winsup/cygwin/hookapi.cc | 2 +- winsup/cygwin/path.h | 7 +++++++ winsup/cygwin/spawn.cc | 20 ++++++++------------ 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 1a68b5c8e..40014eebb 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2005-09-07 Christopher Faylor + + * hookapi.cc (rvadelta): Change argument to DWORD to eliminate a + compiler warning. + + * path.h (path_conv::set_cygexec): New function. + * spawn.cc (av::iscygwin): Eliminate. + (av::av): Don't initialize iscygwin. + (spawn_guts): Just use real_path.iscygexec for all tests. + (av::fixup): Short circuit test if .exe extension and known cygexec. + Set cygexec flag appropriately if we find that program uses cygwin1.dll. + 2005-09-06 Christopher Faylor * dcrt0.cc (initial_env): Don't attempt stracing if dynamically loaded. diff --git a/winsup/cygwin/hookapi.cc b/winsup/cygwin/hookapi.cc index 8857b3f0e..08e257ba1 100644 --- a/winsup/cygwin/hookapi.cc +++ b/winsup/cygwin/hookapi.cc @@ -39,7 +39,7 @@ PEHeaderFromHModule (HMODULE hModule) } long -rvadelta (PIMAGE_NT_HEADERS pnt, long import_rva) +rvadelta (PIMAGE_NT_HEADERS pnt, DWORD import_rva) { PIMAGE_SECTION_HEADER section = (PIMAGE_SECTION_HEADER) (pnt + 1); for (int i = 0; i < pnt->FileHeader.NumberOfSections; i++) diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index a502e8629..14c23ebe5 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -151,6 +151,13 @@ class path_conv int is_lnk_special () const {return is_fs_device () || isfifo () || is_lnk_symlink ();} int issocket () const {return dev.devn == FH_UNIX;} int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;} + void set_cygexec (bool isset) + { + if (isset) + path_flags |= PATH_CYGWIN_EXEC; + else + path_flags &= ~PATH_CYGWIN_EXEC; + } bool isro () const {return !!(path_flags & PATH_RO);} bool exists () const {return fileattr != INVALID_FILE_ATTRIBUTES;} bool has_attribute (DWORD x) const {return exists () && (fileattr & x);} diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 87b2b6dcb..39d2948df 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -277,9 +277,8 @@ class av int error; int argc; bool win16_exe; - bool iscygwin; av (): argv (NULL) {} - av (int ac_in, const char * const *av_in) : calloced (0), error (false), argc (ac_in), win16_exe (false), iscygwin (false) + av (int ac_in, const char * const *av_in) : calloced (0), error (false), argc (ac_in), win16_exe (false) { argv = (char **) cmalloc (HEAP_1_ARGV, (argc + 5) * sizeof (char *)); memcpy (argv, av_in, (argc + 1) * sizeof (char *)); @@ -459,7 +458,6 @@ spawn_guts (const char * prog_arg, const char *const *argv, one_line.add (argv[2]); strcpy (real_path, argv[0]); null_app_name = true; - newargv.iscygwin = false; goto skip_arg_parsing; } @@ -477,7 +475,7 @@ spawn_guts (const char * prog_arg, const char *const *argv, if (res) goto out; - if (real_path.iscygexec () || newargv.iscygwin) + if (real_path.iscygexec ()) newargv.dup_all (); else { @@ -624,7 +622,7 @@ spawn_guts (const char * prog_arg, const char *const *argv, cygheap->user.deimpersonate (); moreinfo->envp = build_env (envp, envblock, moreinfo->envc, real_path.iscygexec ()); - ciresrv.set (chtype, newargv.iscygwin); + ciresrv.set (chtype, real_path.iscygexec ()); ciresrv.moreinfo = moreinfo; si.lpReserved2 = (LPBYTE) &ciresrv; @@ -1019,8 +1017,9 @@ spawnvpe (int mode, const char *file, const char * const *argv, int av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, const char *ext) { - /* If the file name ends in either .exe, .com, .bat, or .cmd we assume - that it is NOT a script file */ + bool exeext = strcasematch (ext, ".exe"); + if (exeext && real_path.iscygexec ()) + return 0; while (1) { HANDLE h = CreateFile (real_path, GENERIC_READ, @@ -1044,7 +1043,7 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, unsigned off = (unsigned char) buf[0x18] | (((unsigned char) buf[0x19]) << 8); win16_exe = off < sizeof (IMAGE_DOS_HEADER); if (!win16_exe) - iscygwin = hook_or_detect_cygwin (buf, NULL); + real_path.set_cygexec (!!hook_or_detect_cygwin (buf, NULL)); UnmapViewOfFile (buf); break; } @@ -1092,10 +1091,7 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, if (!pgm) { if (strcasematch (ext, ".com")) - { - iscygwin = false; - break; - } + break; pgm = (char *) "/bin/sh"; arg1 = NULL; }