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: b5e1003722 ("Cygwin: processes: use dedicated Cygwin PID rather than Windows PID")
Fixes: 88605243a1 ("Cygwin: fix child getting another pid after spawnve")
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2019-07-24 17:48:57 +02:00 committed by Corinna Vinschen
parent 2232498c71
commit 3a72edc124
2 changed files with 2 additions and 3 deletions

View File

@ -652,7 +652,7 @@ void
child_info_spawn::handle_spawn ()
{
extern void fixup_lockf_after_exec (bool);
HANDLE h;
HANDLE h = INVALID_HANDLE_VALUE;
if (!dynamically_loaded || get_parent_handle ())
{
cygheap_fixup_in_child (true);

View File

@ -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;