From c19e7ba723bb4246a375b41678c2b730718d00e4 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Wed, 23 Aug 2000 14:53:25 +0000 Subject: [PATCH] * include/sys/cygwin.h: Protect class definitions. --- winsup/cygwin/ChangeLog | 4 ++++ winsup/cygwin/dcrt0.cc | 11 ++++++++++- winsup/cygwin/include/sys/cygwin.h | 2 ++ winsup/cygwin/pinfo.cc | 21 ++++++++++++++------- winsup/cygwin/pinfo.h | 10 +++++++--- winsup/cygwin/shared.h | 1 + winsup/cygwin/spawn.cc | 4 ++++ winsup/cygwin/winsup.h | 1 - 8 files changed, 42 insertions(+), 12 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 46718b633..0bb01136d 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +Wed Aug 23 10:51:57 2000 Christopher Faylor + + * include/sys/cygwin.h: Protect class definitions. + Tue Aug 22 13:57:36 2000 Christopher Faylor * path.cc (symlink_info::check): Clear error on each iteration of diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index fa0f4dd86..ff433128a 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -666,7 +666,7 @@ dll_crt0_1 () // should be blocked. if (mypid) - set_myself ((pid_t) mypid); + set_myself ((pid_t) mypid, NULL); (void) SetErrorMode (SEM_FAILCRITICALERRORS); @@ -834,6 +834,7 @@ _dll_crt0 () DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc, &hMainThread, 0, FALSE, DUPLICATE_SAME_ACCESS); + HANDLE h; GetStartupInfo (&si); if (si.cbReserved2 >= EXEC_MAGIC_SIZE && memcmp (ciresrv->zero, zeros, sizeof (zeros)) == 0) @@ -868,6 +869,14 @@ _dll_crt0 () case PROC_EXEC: case PROC_SPAWN: info = si.lpReserved2 + ciresrv->cb; + if (child_proc_info->myself_pinfo && + DuplicateHandle (hMainProc, child_proc_info->myself_pinfo, + hMainProc, &h, 0, 0, + DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) + { + set_myself (mypid, h); + mypid = 0; + } break; case PROC_FORK: case PROC_FORK1: diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h index d6d83eb60..5b6cc7011 100644 --- a/winsup/cygwin/include/sys/cygwin.h +++ b/winsup/cygwin/include/sys/cygwin.h @@ -109,8 +109,10 @@ enum SIZEOF_PER_PROCESS) to make sure you remember to make the adjustment. */ +#ifdef __cplusplus class ResourceLocks; class MTinterface; +#endif struct per_process { diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 347015be4..0d52ec9f9 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -30,17 +30,17 @@ static pinfo NO_COPY myself_identity ((_pinfo *)&pinfo_dummy); This is done once when the dll is first loaded. */ void __stdcall -set_myself (pid_t pid) +set_myself (pid_t pid, HANDLE h) { DWORD winpid = GetCurrentProcessId (); if (pid == 1) pid = cygwin_pid (winpid); - myself.init (pid, 1); + myself.init (pid, 1, h); myself->dwProcessId = winpid; myself->process_state |= PID_IN_USE; myself->start_time = time (NULL); /* Register our starting time. */ pid_t myself_cyg_pid = cygwin_pid (myself->dwProcessId); - if (pid != myself_cyg_pid) + if (pid != myself_cyg_pid && parent_alive) myself_identity.init (myself_cyg_pid, PID_EXECED); char buf[30]; @@ -95,7 +95,7 @@ pinfo_init (LPBYTE info) { /* Invent our own pid. */ - set_myself (1); + set_myself (1, NULL); myself->ppid = 1; myself->pgid = myself->sid = myself->pid; myself->ctty = -1; @@ -197,7 +197,7 @@ _pinfo::record_death () } void -pinfo::init (pid_t n, DWORD create) +pinfo::init (pid_t n, DWORD create, HANDLE in_h) { if (n == myself->pid) { @@ -217,7 +217,12 @@ pinfo::init (pid_t n, DWORD create) else mapsize = sizeof (_pinfo); - if (!create) + if (in_h) + { + h = in_h; + created = 0; + } + else if (!create) { /* CGF FIXME -- deal with inheritance after an exec */ h = OpenFileMappingA (FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mapname); @@ -225,7 +230,7 @@ pinfo::init (pid_t n, DWORD create) } else { - h = CreateFileMapping ((HANDLE) 0xffffffff, &sec_none_nih, + h = CreateFileMapping ((HANDLE) 0xffffffff, &sec_all_nih, PAGE_READWRITE, 0, mapsize, mapname); created = h && GetLastError () != ERROR_ALREADY_EXISTS; } @@ -238,11 +243,13 @@ pinfo::init (pid_t n, DWORD create) return; } + ProtectHandle1 (h, pinfo_shared_handle); child = (_pinfo *) MapViewOfFile (h, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); if (child->process_state & PID_EXECED) { pid_t realpid = child->pid; + debug_printf ("execed process windows pid %d, cygwin pid %d", n, realpid); release (); if (realpid == n) api_fatal ("retrieval of execed process info for pid %d failed due to recursion.", n); diff --git a/winsup/cygwin/pinfo.h b/winsup/cygwin/pinfo.h index b8ee9140b..f84659813 100644 --- a/winsup/cygwin/pinfo.h +++ b/winsup/cygwin/pinfo.h @@ -117,7 +117,7 @@ class pinfo _pinfo *child; int destroy; public: - void init (pid_t n, DWORD create = 0); + void init (pid_t n, DWORD create = 0, HANDLE h = NULL); pinfo () {} pinfo (_pinfo *x): child (x) {} pinfo (pid_t n) {init (n);} @@ -127,7 +127,7 @@ public: if (h) { UnmapViewOfFile (child); - CloseHandle (h); + ForceCloseHandle1 (h, pinfo_shared_handle); h = NULL; } } @@ -145,7 +145,9 @@ public: int operator == (char *x) const {return (char *) child == x;} _pinfo *operator * () const {return child;} operator _pinfo * () const {return child;} + // operator bool () const {return (int) h;} void remember () {destroy = 0; proc_subproc (PROC_ADDCHILD, (DWORD) this);} + HANDLE shared_handle () {return h;} }; #define ISSTATE(p, f) (!!((p)->process_state & f)) @@ -168,5 +170,7 @@ cygwin_pid (pid_t pid) { return (pid_t) (os_being_run == winNT) ? pid : -(int) pid; } -void __stdcall pinfo_init (PBYTE); + +void __stdcall pinfo_init (BYTE *); +void __stdcall set_myself (pid_t pid, HANDLE h = NULL); extern pinfo myself; diff --git a/winsup/cygwin/shared.h b/winsup/cygwin/shared.h index 2a8e9a6e1..1671d0dba 100644 --- a/winsup/cygwin/shared.h +++ b/winsup/cygwin/shared.h @@ -67,6 +67,7 @@ public: HANDLE shared_h; HANDLE console_h; HANDLE parent_alive; // handle of thread used to track children + HANDLE myself_pinfo; }; class child_info_fork: public child_info diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 940f8d170..b43746cae 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -494,6 +494,10 @@ skip_arg_parsing: } init_child_info (chtype, ciresrv, (mode == _P_OVERLAY) ? myself->pid : 1, spr); + if (mode != _P_OVERLAY || + !DuplicateHandle (hMainProc, myself.shared_handle (), hMainProc, &ciresrv->myself_pinfo, 0, + TRUE, DUPLICATE_SAME_ACCESS)) + ciresrv->myself_pinfo = NULL; LPBYTE resrv = si.lpReserved2 + sizeof *ciresrv; # undef ciresrv diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index be151e75b..56126692a 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -283,7 +283,6 @@ long __stdcall to_time_t (FILETIME * ptr); int __stdcall lock_pinfo_for_update (DWORD timeout); #endif void unlock_pinfo (void); -void _stdcall set_myself (pid_t pid); /* Retrieve a security descriptor that allows all access */ SECURITY_DESCRIPTOR *__stdcall get_null_sd (void);