On Thu, Jan 14, 2016 at 09:02:43PM +1300, David Phillips wrote:
> The child thread was created because execlp will not return if successful.
> The eprintf was placed after the call to execlp to catch any error, but the
> child continued to return a (closed) fds[0], resulting in a second slideshow
> being run by the child.
> 
> This commit fixes the issue by killing the child.
> ---
>  sent.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/sent.c b/sent.c
> index fc5e389..88abe90 100644
> --- a/sent.c
> +++ b/sent.c
> @@ -153,7 +153,7 @@ filter(int fd, const char *cmd)
>               close(fds[0]);
>               close(fds[1]);
>               execlp(cmd, cmd, (char *)0);
> -             eprintf("execlp %s:", cmd);
> +             die("execlp %s:", cmd);
>       }
>       close(fds[1]);
>       return fds[0];
> -- 
> 2.6.2
> 

I should mention there are many more places in the code where this
issue happens.

On BSD there is err() and warn() which makes it very clear which one
is fatal.

One approach is to keep die() and rename eprintf() to something more
appropriate.

Otherwise we can use the approach in sbase which is to have eprintf()
be equivalent to die() and weprintf() for just the warning version.

Reply via email to