[Libguestfs] collectd leaks SIGCHLD == SIG_IGN into plugins

Daniel P. Berrangé berrange at redhat.com
Tue Nov 13 10:04:33 UTC 2018

On Fri, Nov 09, 2018 at 12:19:30PM +0000, Richard W.M. Jones wrote:
> Peter Dimitrov and myself were debugging a very peculiar bug when
> libguestfs is run as a plugin from collectd:
>   https://www.redhat.com/archives/libguestfs/2018-November/thread.html#00023
> The long story short is that collectd leaks SIGCHLD == SIG_IGN setting
> into plugins:
>   https://www.redhat.com/archives/libguestfs/2018-November/msg00095.html
> This means that any plugin that does the usual pattern of:
>   pid = fork ();
>   ...
>   if (waitpid (pid, NULL, 0) == -1) {
>     perror ("waitpid");
>     exit (EXIT_FAILURE);
>   }
> will fail, because the forked subprocess is automatically reaped
> before waitpid is called, resulting in the wait failing with errno ==
> It is possible to work around this by adding:
>   signal (SIGCHLD, SIG_DFL);
> to the plugin.  However I believe this is a bug in collectd, and it
> should sanitize signals (and maybe other things) before running
> plugins.

Yes, I'm inclined to agree. If an app or library is spawning external
processes it should take care to restore signal setup to a "normal" state.
This means not only setting SIG_DFL for all signals, but also just as
importantly, the signal mask. It should be set to all ones before calling
fork, and set back to all zeroes immedaitely before execve, as illustrated
in libvirt to avoid races:



|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

More information about the Libguestfs mailing list