On Jul 21 22:46, Takashi Yano wrote:
> ...completion in child process because the cygheap should not be
> changed to avoid mismatch between child_info::cygheap_max and
> ::cygheap_max. Otherwise, child_copy() might copy cygheap being
> modified by other process.
> 
> Fixes: 977ad5434cc0 ("* spawn.cc (spawn_guts): Call refresh_cygheap before 
> creating a new process to ensure that cygheap_max is up-to-date.")
> Reviewed-by: Corinna Vinschen <[email protected]>
> Signed-off-by: Takashi Yano <[email protected]>
> ---
>  winsup/cygwin/spawn.cc | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
> index cb58b6eed..fd623f4c5 100644
> --- a/winsup/cygwin/spawn.cc
> +++ b/winsup/cygwin/spawn.cc
> @@ -542,7 +542,6 @@ child_info_spawn::worker (const char *prog_arg, const 
> char *const *argv,
>       ::cygheap->ctty ? ::cygheap->ctty->tc_getpgid () : 0;
>        if (!iscygwin () && ctty_pgid && ctty_pgid != myself->pgid)
>       c_flags |= CREATE_NEW_PROCESS_GROUP;
> -      refresh_cygheap ();
>  
>        if (mode == _P_DETACH)
>       /* all set */;
> @@ -611,6 +610,8 @@ child_info_spawn::worker (const char *prog_arg, const 
> char *const *argv,
>  
>        cygpid = (mode != _P_OVERLAY) ? create_cygwin_pid () : myself->pid;
>  
> +      cygheap->lock ();
> +      refresh_cygheap ();
>        wchar_t wcmd[(size_t) cmd];
>        if (!::cygheap->user.issetuid ()
>         || (::cygheap->user.saved_uid == ::cygheap->user.real_uid
> @@ -844,6 +845,7 @@ child_info_spawn::worker (const char *prog_arg, const 
> char *const *argv,
>       /* Just mark a non-cygwin process as 'synced'.  We will still eventually
>          wait for it to exit in maybe_set_exit_code_from_windows(). */
>       synced = iscygwin () ? sync (pi.dwProcessId, pi.hProcess, INFINITE) : 
> true;
> +      cygheap->unlock ();
>  
>        switch (mode)
>       {
> -- 
> 2.45.1

GTG

Thanks,
Corinna

Reply via email to