[libvirt] [RFC PATCH 2/4] util: Fix deadlock across fork()
Daniel P. Berrange
berrange at redhat.com
Tue Oct 10 08:52:09 UTC 2017
On Mon, Oct 09, 2017 at 09:14:56PM +0200, Marc Hartmayer wrote:
> This commit fixes the deadlock introduced by commit
> 0980764dee687e8da86dc410c351759867163389. The call getgrouplist() of
> the glibc library isn't safe to be called in between fork and
> exec (see commit 75c125641ac73473ba4b0542524d67a184769c8e).
>
> Signed-off-by: Marc Hartmayer <mhartmay at linux.vnet.ibm.com>
> Fixes: 0980764dee68 ("util: share code between virExec and virCommandExec")
> Reviewed-by: Bjoern Walk <bwalk at linux.vnet.ibm.com>
> Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
> ---
> src/lxc/lxc_container.c | 12 +++++++++++-
> src/util/vircommand.c | 25 ++++++++++++++-----------
> src/util/vircommand.h | 2 +-
> tests/commandtest.c | 15 ++++++++++-----
> 4 files changed, 36 insertions(+), 18 deletions(-)
>
> diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
> index ec6d6a86b0b6..1f220c602b0a 100644
> --- a/src/lxc/lxc_container.c
> +++ b/src/lxc/lxc_container.c
> @@ -2182,6 +2182,8 @@ static int lxcContainerChild(void *data)
> virDomainFSDefPtr root;
> virCommandPtr cmd = NULL;
> int hasReboot;
> + gid_t *groups = NULL;
> + int ngroups;
>
> if (NULL == vmDef) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -2297,6 +2299,13 @@ static int lxcContainerChild(void *data)
> goto cleanup;
> }
>
> + /* TODO is it safe to call it here or should this call be moved in
> + * front of the clone() as otherwise there might be a risk for a
> + * deadlock */
Yes, clone() is equiv to fork() so it needs to be before clone()
> + if ((ngroups = virGetGroupList(virCommandGetUID(cmd), virCommandGetGID(cmd),
> + &groups)) < 0)
> + goto cleanup;
> +
> ret = 0;
> cleanup:
> VIR_FREE(ttyPath);
Regards,
Daniel
--
|: 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 libvir-list
mailing list