From 5a0b853ecf55cc41c9cbd8894b8a27dbd3270608 Mon Sep 17 00:00:00 2001 From: cgf Date: Mon, 5 Sep 2005 17:30:02 +0000 Subject: [PATCH] * cygheap.cc (cygheap_init): Eliminate debugging #if. * fork.cc (fork_parent): Don't issue errors if "somebody" has set the PID_EXITED flag on a child. Don't close process handle if it has potentially already been closed. * pinfo.cc (winpids::add): Eliminate PID_ALLPIDS handling which was obsoleted by previous changes. * spawn.cc (av::fixup): Do win16 detection for .com files. Make sure that buffer has been unmapped in all cases. --- winsup/cygwin/ChangeLog | 13 +++++++++++++ winsup/cygwin/cygheap.cc | 5 ----- winsup/cygwin/fork.cc | 13 +++++++------ winsup/cygwin/pinfo.cc | 5 ++--- winsup/cygwin/spawn.cc | 5 ++++- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 08907250f6..79e62e8e71 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +2005-09-05 Christopher Faylor + + * cygheap.cc (cygheap_init): Eliminate debugging #if. + + * fork.cc (fork_parent): Don't issue errors if "somebody" has set the + PID_EXITED flag on a child. Don't close process handle if it has + potentially already been closed. + * pinfo.cc (winpids::add): Eliminate PID_ALLPIDS handling which was + obsoleted by previous changes. + + * spawn.cc (av::fixup): Do win16 detection for .com files. Make sure + that buffer has been unmapped in all cases. + 2005-09-05 Corinna Vinschen * thread.h (pthread_mutex::get_pthread_self): Remove. diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc index 7db84cc5b3..6cbdf6ef78 100644 --- a/winsup/cygwin/cygheap.cc +++ b/winsup/cygwin/cygheap.cc @@ -158,12 +158,7 @@ cygheap_init () cygheap_protect.init ("cygheap_protect"); if (!cygheap) { -#if 1 cygheap = (init_cygheap *) memset (_cygheap_start, 0, _cygheap_mid - _cygheap_start); -#else - cygheap = (init_cygheap *) _cygheap_start; -#endif - cygheap_max = cygheap; _csbrk (sizeof (*cygheap)); } diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 785aabd4f2..f16eabc32a 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -283,8 +283,7 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_ pthread::atforkprepare (); - int c_flags = GetPriorityClass (hMainProc) /*| - CREATE_NEW_PROCESS_GROUP*/; + int c_flags = GetPriorityClass (hMainProc); STARTUPINFO si = {0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL}; /* If we don't have a console, then don't create a console for the @@ -336,7 +335,7 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_ /* Remove impersonation */ cygheap->user.deimpersonate (); - syscall_printf ("CreateProcess (%s, %s, 0, 0, 1, %x, 0, 0, %p, %p)", + syscall_printf ("CreateProcess (%s, %s, 0, 0, 1, %p, 0, 0, %p, %p)", myself->progname, myself->progname, c_flags, &si, &pi); bool locked = __malloc_lock (); rc = CreateProcess (myself->progname, /* image to run */ @@ -418,7 +417,8 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_ /* Wait for subproc to initialize itself. */ if (!ch.sync (child->pid, pi.hProcess, FORK_WAIT_TIMEOUT)) { - system_printf ("child %d died waiting for longjmp before initialization", child_pid); + if (NOTSTATE (child, PID_EXITED)) + system_printf ("child %d died waiting for longjmp before initialization", child_pid); goto cleanup; } @@ -469,7 +469,8 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_ goto cleanup; else if (!ch.sync (child->pid, pi.hProcess, FORK_WAIT_TIMEOUT)) { - system_printf ("child %d died waiting for dll loading", child_pid); + if (NOTSTATE (child, PID_EXITED)) + system_printf ("child %d died waiting for dll loading", child_pid); goto cleanup; } @@ -506,7 +507,7 @@ fork_parent (HANDLE&, dll *&first_dll, bool& load_dlls, void *stack_here, child_ __malloc_unlock (); /* Remember to de-allocate the fd table. */ - if (pi.hProcess) + if (pi.hProcess && !child.hProcess) ForceCloseHandle1 (pi.hProcess, childhProc); if (pi.hThread) ForceCloseHandle (pi.hThread); diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 1a08f575b0..0e89ca03b0 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -1196,8 +1196,7 @@ winpids::add (DWORD& nelem, bool winpid, DWORD pid) pinfolist = (pinfo *) realloc (pinfolist, size_pinfolist (npidlist + 1)); } - pinfolist[nelem].init (cygpid, PID_NOREDIR | (winpid ? PID_ALLPIDS : 0) - | pinfo_access, NULL); + pinfolist[nelem].init (cygpid, PID_NOREDIR | pinfo_access, NULL); if (winpid) goto out; @@ -1205,7 +1204,7 @@ winpids::add (DWORD& nelem, bool winpid, DWORD pid) { if (!pinfo_access) return; - pinfolist[nelem].init (cygpid, PID_NOREDIR | (winpid ? PID_ALLPIDS : 0), NULL); + pinfolist[nelem].init (cygpid, PID_NOREDIR, NULL); if (!pinfolist[nelem]) return; } diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 39402182aa..e2c3decf5b 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -1020,7 +1020,9 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, { /* If the file name ends in either .exe, .com, .bat, or .cmd we assume that it is NOT a script file */ - while (*ext == '\0' || chtype == PROC_SPAWN || (wincap.detect_win16_exe () && strcasematch (ext, ".exe"))) + while (*ext == '\0' || chtype == PROC_SPAWN + || (wincap.detect_win16_exe () && (strcasematch (ext, ".exe") + || strcasematch (ext, ".com")))) { HANDLE h = CreateFile (real_path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, @@ -1053,6 +1055,7 @@ av::fixup (child_info_types chtype, const char *prog_arg, path_conv& real_path, if (real_path.has_acls () && allow_ntsec && check_file_access (real_path, X_OK)) { + UnmapViewOfFile (buf); debug_printf ("... but not executable"); break; } -- 2.11.0