Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2019-07-24 18:48:57 +0300
committerCorinna Vinschen <corinna-cygwin@cygwin.com>2019-07-25 11:45:52 +0300
commit3a72edc124e7a459ee8a62ebb74b82fe38b8073e (patch)
tree8a0ff9e5fb057bc78fd85aab1b8fbf4b7781e0bd /winsup/cygwin/pinfo.cc
parent2232498c712acc97a38fdc297cbe53ba74d0ec2c (diff)
Cygwin: Fix the address of myself
Introducing an independent Cygwin PID introduced a regression: The expectation is that the myself pinfo pointer always points to a specific address right in front of the loaded Cygwin DLL. However, the independent Cygwin PID changes broke this. To create myself at the right address requires to call init with h0 set to INVALID_HANDLE_VALUE or an existing address: void pinfo::init (pid_t n, DWORD flag, HANDLE h0) { [...] if (!h0 || myself.h) [...] else { shloc = SH_MYSELF; if (h0 == INVALID_HANDLE_VALUE) <-- !!! h0 = NULL; } The aforementioned commits changed that so h0 was always NULL, this way creating myself at an arbitrary address. This patch makes sure to set the handle to INVALID_HANDLE_VALUE again when creating a new process, so init knows that myself has to be created in the right spot. While at it, fix a potential uninitialized handle value in child_info_spawn::handle_spawn. Fixes: b5e1003722cb ("Cygwin: processes: use dedicated Cygwin PID rather than Windows PID") Fixes: 88605243a19b ("Cygwin: fix child getting another pid after spawnve") Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/pinfo.cc')
-rw-r--r--winsup/cygwin/pinfo.cc3
1 files changed, 1 insertions, 2 deletions
diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc
index 123784e67..ffd4c8cd9 100644
--- a/winsup/cygwin/pinfo.cc
+++ b/winsup/cygwin/pinfo.cc
@@ -62,11 +62,10 @@ pinfo::thisproc (HANDLE h)
{
cygheap->pid = create_cygwin_pid ();
flags |= PID_NEW;
+ h = INVALID_HANDLE_VALUE;
}
/* spawnve'd process got pid in parent, cygheap->pid has been set in
child_info_spawn::handle_spawn. */
- else if (h == INVALID_HANDLE_VALUE)
- h = NULL;
init (cygheap->pid, flags, h);
procinfo->process_state |= PID_IN_USE;