> On 2022-09-25 16:25, Dmitry Goncharov wrote:
> 
> On Sun, Sep 25, 2022 at 2:09 AM Martin Dorey
> <martin.do...@hitachivantara.com> wrote:
>> And vfork is where that happens.  If I’ve followed the thicket of #ifdef 
>> correctly and understood the vfork man page, then this is illegal when using 
>> vfork:
>> 
>> https://github.com/mirror/make/blob/master/src/job.c#L2556
> 
> 
> Thanks, Martin.
> This is indeed the culprit.
> I was able to find a linux where this reproduces. However, the this
> does this reproduce on my sun. Denis, can you please try this patch on
> your sun?
> 
> regards, Dmitry
> 
> Here is a patch
> 
> index d12a9138..1ed71f0a 100644
> --- a/src/job.c
> +++ b/src/job.c
> @@ -2286,6 +2286,8 @@ child_execute_job (struct childbase *child, int
> good_stdin, char **argv)
>   posix_spawnattr_t attr;
>   posix_spawn_file_actions_t fa;
>   short flags = 0;
> +#else
> +  char **parent_environ = environ;
> #endif
> 
>   /* Divert child output if we want to capture it.  */
> @@ -2301,7 +2303,12 @@ child_execute_job (struct childbase *child, int
> good_stdin, char **argv)
> 
>   pid = vfork();
>   if (pid != 0)
> +    {
> +      /* The child sets environ to child->environment before calling execvp.
> +       * Restore it here.  */
> +      environ = parent_environ;
>       return pid;
> +    }
> 
>   /* We are the child.  */
>   unblock_all_sigs ();
> @@ -2552,7 +2559,8 @@ exec_command (char **argv, char **envp)
>     errno = ENOEXEC;
> 
> # else
> -  /* Run the program.  */
> +  /* Run the program.
> +   * The parent has to restore environ.  */
>   environ = envp;
>   execvp (argv[0], argv);

Hello,
This patch works perfectly, both on my 32bit linux and my 32bit solaris 10.
Thank you.
Regards,
Denis Excoffier.


Reply via email to