[lxc-devel] [PATCH] lxc_monitor: fix memory leak on @fds and close fds

Serge Hallyn serge.hallyn at ubuntu.com
Mon Jun 29 15:04:39 UTC 2015


Quoting Arjun Sreedharan (arjun024 at gmail.com):
> Ping !

Applied.

I did notice one oddity, though, below.  Would you mind sending a new
patch (on top of this one) to fix it (assuming I'm not wrong)?  It's
really not a big deal but could confuse people and upset coverity.

> On 10 June 2015 at 23:54, Arjun Sreedharan <arjun024 at gmail.com> wrote:
> >
> > also label and consolidate error conditions for
> > better readability
> >
> > Signed-off-by: Arjun Sreedharan <arjun024 at gmail.com>
> > Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
> > ---
> >  src/lxc/lxc_monitor.c | 51 +++++++++++++++++++++++++++++++++++++--------------
> >  1 file changed, 37 insertions(+), 14 deletions(-)
> >
> > diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c
> > index b3d8912..3f96702 100644
> > --- a/src/lxc/lxc_monitor.c
> > +++ b/src/lxc/lxc_monitor.c
> > @@ -71,6 +71,18 @@ Options :\n\
> >         .lxcpath_additional = -1,
> >  };
> >
> > +static void close_fds(struct pollfd *fds, nfds_t nfds)
> > +{
> > +       nfds_t i;
> > +
> > +       if (nfds < 1)
> > +               return;
> > +
> > +       for (i = 0; i < nfds; ++i) {
> > +               close(fds[i].fd);
> > +       }
> > +}
> > +
> >  int main(int argc, char *argv[])
> >  {
> >         char *regexp;
> > @@ -78,7 +90,9 @@ int main(int argc, char *argv[])
> >         regex_t preg;
> >         struct pollfd *fds;
> >         nfds_t nfds;
> > -       int len, rc, i;
> > +       int len, rc_main, rc_snp, i;
> > +
> > +       rc_main = 0;
> >
> >         if (lxc_arguments_parse(&my_args, argc, argv))
> >                 return 1;
> > @@ -119,24 +133,24 @@ int main(int argc, char *argv[])
> >                 ERROR("failed to allocate memory");
> >                 return 1;
> >         }
> > -       rc = snprintf(regexp, len, "^%s$", my_args.name);
> > -       if (rc < 0 || rc >= len) {
> > +       rc_snp = snprintf(regexp, len, "^%s$", my_args.name);
> > +       if (rc_snp < 0 || rc_snp >= len) {
> >                 ERROR("Name too long");
> > -               free(regexp);
> > -               return 1;
> > +               rc_main = 1;
> > +               goto error;
> >         }
> >
> >         if (regcomp(&preg, regexp, REG_NOSUB|REG_EXTENDED)) {
> >                 ERROR("failed to compile the regex '%s'", my_args.name);
> > -               free(regexp);
> > -               return 1;
> > +               rc_main = 1;
> > +               goto error;
> >         }
> > -       free(regexp);
> >

from here on we've got preg.  But in the next failure case you goto
error which won't free preg.

> >         fds = malloc(my_args.lxcpath_cnt * sizeof(struct pollfd));
> >         if (!fds) {
> >                 SYSERROR("out of memory");
> > -               return -1;
> > +               rc_main = -1;
> > +               goto error;
> >         }
> >
> >         nfds = my_args.lxcpath_cnt;
> > @@ -147,8 +161,9 @@ int main(int argc, char *argv[])
> >
> >                 fd = lxc_monitor_open(my_args.lxcpath[i]);
> >                 if (fd < 0) {
> > -                       regfree(&preg);
> > -                       return 1;
> > +                       close_fds(fds, i);
> > +                       rc_main = 1;
> > +                       goto cleanup;
> >                 }
> >                 fds[i].fd = fd;
> >                 fds[i].events = POLLIN;
> > @@ -159,8 +174,8 @@ int main(int argc, char *argv[])
> >
> >         for (;;) {
> >                 if (lxc_monitor_read_fdset(fds, nfds, &msg, -1) < 0) {
> > -                       regfree(&preg);
> > -                       return 1;
> > +                       rc_main = 1;
> > +                       goto close_and_clean;
> >                 }
> >
> >                 msg.name[sizeof(msg.name)-1] = '\0';
> > @@ -182,7 +197,15 @@ int main(int argc, char *argv[])
> >                 }
> >         }
> >
> > +close_and_clean:
> > +       close_fds(fds, nfds);
> > +
> > +cleanup:
> >         regfree(&preg);
> > +       free(fds);
> >
> > -       return 0;
> > +error:
> > +       free(regexp);
> > +
> > +       return rc_main;
> >  }
> > --
> > 1.7.11.7
> >


More information about the lxc-devel mailing list