[libvirt] [PATCH] util: avoid fds leak on virEventPollInit

Daniel Veillard veillard at redhat.com
Tue Jul 19 10:01:40 UTC 2011


On Tue, Jul 19, 2011 at 11:00:21AM +0200, Matthias Bolte wrote:
> 2011/7/19  <ajia at redhat.com>:
> > * src/util/event_poll.c: fix file descriptors leak on virEventPollInit.
> >
> > Detected in valgrind run:
> > ==1254==
> > ==1254== FILE DESCRIPTORS: 6 open at exit.
> > ==1254== Open file descriptor 5:
> > ==1254==    at 0x30736D9D47: pipe2 (syscall-template.S:82)
> > ==1254==    by 0x4DD6267: rpl_pipe2 (pipe2.c:61)
> > ==1254==    by 0x4C4C1C5: virEventPollInit (event_poll.c:648)
> > ==1254==    by 0x4C4AA94: virEventRegisterDefaultImpl (event.c:208)
> > ==1254==    by 0x42150C: main (virsh.c:13790)
> > ==1254==
> > ==1254== Open file descriptor 4:
> > ==1254==    at 0x30736D9D47: pipe2 (syscall-template.S:82)
> > ==1254==    by 0x4DD6267: rpl_pipe2 (pipe2.c:61)
> > ==1254==    by 0x4C4C1C5: virEventPollInit (event_poll.c:648)
> > ==1254==    by 0x4C4AA94: virEventRegisterDefaultImpl (event.c:208)
> > ==1254==    by 0x42150C: main (virsh.c:13790)
> > ==1254==
> >
> > * how to reproduce?
> >  % valgrind -v --track-fds=yes virsh list
> >
> > ---
> >  src/util/event_poll.c |   13 ++++++++++---
> >  1 files changed, 10 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/util/event_poll.c b/src/util/event_poll.c
> > index 285ba50..1e4ef96 100644
> > --- a/src/util/event_poll.c
> > +++ b/src/util/event_poll.c
> > @@ -639,6 +639,8 @@ static void virEventPollHandleWakeup(int watch ATTRIBUTE_UNUSED,
> >
> >  int virEventPollInit(void)
> >  {
> > +    int ret = -1;
> > +
> >     if (virMutexInit(&eventLoop.lock) < 0) {
> >         virReportSystemError(errno, "%s",
> >                              _("Unable to initialize mutex"));
> > @@ -648,7 +650,7 @@ int virEventPollInit(void)
> >     if (pipe2(eventLoop.wakeupfd, O_CLOEXEC | O_NONBLOCK) < 0) {
> >         virReportSystemError(errno, "%s",
> >                              _("Unable to setup wakeup pipe"));
> > -        return -1;
> > +        goto cleanup;
> >     }
> >
> >     if (virEventPollAddHandle(eventLoop.wakeupfd[0],
> > @@ -657,10 +659,15 @@ int virEventPollInit(void)
> >         virEventError(VIR_ERR_INTERNAL_ERROR,
> >                       _("Unable to add handle %d to event loop"),
> >                       eventLoop.wakeupfd[0]);
> > -        return -1;
> > +        goto cleanup;
> >     }
> >
> > -    return 0;
> > +    ret = 0;
> > +
> > +cleanup:
> > +    close(eventLoop.wakeupfd[0]);
> > +    close(eventLoop.wakeupfd[1]);
> > +    return ret;
> >  }
> 
> NACK, as this is wrong. You're closing the pipe in all cases in
> virEventPollInit, but the pipe is supposed to be used afterwards. As
> there is no virEventPollDeinit this FD leak has to be considered as a
> static leak that's expected and not to be fixed. Also close() is
> forbidden and make syntax-check should have told you that.
> 
> What can be done here is closing the pipe in case
> virEventPollAddHandle fails, for example like this:
> 
> diff --git a/src/util/event_poll.c b/src/util/event_poll.c
> index 285ba50..a62f960 100644
> --- a/src/util/event_poll.c
> +++ b/src/util/event_poll.c
> @@ -657,6 +657,8 @@ int virEventPollInit(void)
>          virEventError(VIR_ERR_INTERNAL_ERROR,
>                        _("Unable to add handle %d to event loop"),
>                        eventLoop.wakeupfd[0]);
> +        VIR_CLOSE(eventLoop.wakeupfd[0]);
> +        VIR_CLOSE(eventLoop.wakeupfd[1]);
>          return -1;
>      }

  The only problem I have is why is a simple "virsh list" exhibiting
one of those 2 errors, they sounds like hard cornercases, and not
something to be triggered in such a simple operation. Valgrind had to
emulate one of those code path to raise the error, and that sounds
weird.

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list