diff options
author | Christopher Faylor <me@cgf.cx> | 2005-09-15 00:02:57 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-09-15 00:02:57 +0000 |
commit | 59960f651d84055ca449f142e10097c273cb1a0c (patch) | |
tree | 4e1451bebe4483112aed321c4411838dde18822a /winsup/cygwin/spawn.cc | |
parent | ae37cc121868a4554b5118c8ad45f5493333b39e (diff) | |
download | cygnal-59960f651d84055ca449f142e10097c273cb1a0c.tar.gz cygnal-59960f651d84055ca449f142e10097c273cb1a0c.tar.bz2 cygnal-59960f651d84055ca449f142e10097c273cb1a0c.zip |
* hookapi.cc (hook_or_detect_cygwin): Simplify very slightly.
* spawn.cc (av::fixup): Guard against problems reading an executable which does
not match Microsoft's documentation about PE format.
Diffstat (limited to 'winsup/cygwin/spawn.cc')
-rw-r--r-- | winsup/cygwin/spawn.cc | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 14231dd5a..f82cce095 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -1020,6 +1020,15 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, bool exeext = strcasematch (ext, ".exe"); if (exeext && real_path.iscygexec ()) return 0; + char *buf = NULL; + myfault efault; + if (efault.faulted ()) + { + if (buf) + UnmapViewOfFile (buf); + real_path.set_cygexec (false); + return 0; + } while (1) { HANDLE h = CreateFile (real_path, GENERIC_READ, @@ -1033,22 +1042,32 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, CloseHandle (h); if (!hm) goto err; - char *buf = (char *) MapViewOfFile(hm, FILE_MAP_READ, 0, 0, 0); + buf = (char *) MapViewOfFile(hm, FILE_MAP_READ, 0, 0, 0); CloseHandle (hm); if (!buf) goto err; - if (buf[0] == 'M' && buf[1] == 'Z') + do { - unsigned off = (unsigned char) buf[0x18] | (((unsigned char) buf[0x19]) << 8); - win16_exe = off < sizeof (IMAGE_DOS_HEADER); - if (!win16_exe) - real_path.set_cygexec (!!hook_or_detect_cygwin (buf, NULL)); - UnmapViewOfFile (buf); - break; - } + myfault efault; + if (efault.faulted ()) + { + UnmapViewOfFile (buf); + real_path.set_cygexec (false); + break; + } + if (buf[0] == 'M' && buf[1] == 'Z') + { + unsigned off = (unsigned char) buf[0x18] | (((unsigned char) buf[0x19]) << 8); + win16_exe = off < sizeof (IMAGE_DOS_HEADER); + if (!win16_exe) + real_path.set_cygexec (!!hook_or_detect_cygwin (buf, NULL)); + UnmapViewOfFile (buf); + break; + } + } while (0); - debug_printf ("%s is a script", (char *) real_path); + debug_printf ("%s is possibly a script", (char *) real_path); if (real_path.has_acls () && allow_ntsec && check_file_access (real_path, X_OK)) |