qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [Qemu-devel] [PATCH 12/15] gluster: Plug memory leaks i


From: Niels de Vos
Subject: Re: [Qemu-block] [Qemu-devel] [PATCH 12/15] gluster: Plug memory leaks in qemu_gluster_parse_json()
Date: Fri, 3 Mar 2017 00:17:43 -0800
User-agent: Mutt/1.7.1 (2016-10-04)

On Fri, Mar 03, 2017 at 08:38:45AM +0100, Markus Armbruster wrote:
> Niels de Vos <address@hidden> writes:
> 
> > On Thu, Mar 02, 2017 at 10:44:03PM +0100, Markus Armbruster wrote:
> >> To reproduce, run
> >> 
> >>     $ valgrind qemu-system-x86_64 --nodefaults -S --drive 
> >> driver=gluster,volume=testvol,path=/a/b/c,server.0.type=xxx
> >> 
> >> Signed-off-by: Markus Armbruster <address@hidden>
> >> ---
> >>  block/gluster.c | 28 ++++++++++++++--------------
> >>  1 file changed, 14 insertions(+), 14 deletions(-)
> >> 
> >> diff --git a/block/gluster.c b/block/gluster.c
> >> index 6fbcf9e..35a7abb 100644
> >> --- a/block/gluster.c
> >> +++ b/block/gluster.c
> >> @@ -480,7 +480,7 @@ static int 
> >> qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
> >>                                    QDict *options, Error **errp)
> >>  {
> >>      QemuOpts *opts;
> >> -    GlusterServer *gsconf;
> >> +    GlusterServer *gsconf = NULL;
> >>      GlusterServerList *curr = NULL;
> >>      QDict *backing_options = NULL;
> >>      Error *local_err = NULL;
> >> @@ -529,17 +529,16 @@ static int 
> >> qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
> >>          }
> >>  
> >>          ptr = qemu_opt_get(opts, GLUSTER_OPT_TYPE);
> >> +        if (!ptr) {
> >> +            error_setg(&local_err, QERR_MISSING_PARAMETER, 
> >> GLUSTER_OPT_TYPE);
> >> +            error_append_hint(&local_err, GERR_INDEX_HINT, i);
> >> +            goto out;
> >> +
> >> +        }
> >>          gsconf = g_new0(GlusterServer, 1);
> >>          gsconf->type = qapi_enum_parse(GlusterTransport_lookup, ptr,
> >> -                                       GLUSTER_TRANSPORT__MAX,
> >> -                                       GLUSTER_TRANSPORT__MAX,
> >> +                                       GLUSTER_TRANSPORT__MAX, 0,
> >
> > What is the reason to set the default to 0 and not the more readable
> > GLUSTER_TRANSPORT_UNIX?
> 
> I chose 0 because the actual value must not matter: we don't want a
> default here.
> 
> qapi_enum_parse() returns this argument when ptr isn't found.  If ptr is
> non-null, it additionally sets an error.  Since ptr can't be null here,
> the argument is only returned together with an error.  But then we won't
> use *gsconf.

Ah, right, I that see now.

> Do you think -1 instead of 0 would be clearer?

Yes, it would be to me. -1 is clearly not part of the GLUSTER_TRANSPORT_*
enum, so it suggests it is a different case.

Thanks!

> 
> >>                                         &local_err);
> >> -        if (!ptr) {
> >> -            error_setg(&local_err, QERR_MISSING_PARAMETER, 
> >> GLUSTER_OPT_TYPE);
> >> -            error_append_hint(&local_err, GERR_INDEX_HINT, i);
> >> -            goto out;
> >> -
> >> -        }
> >>          if (local_err) {
> >>              error_append_hint(&local_err,
> >>                                "Parameter '%s' may be 'tcp' or 'unix'\n",
> >> @@ -626,8 +625,10 @@ static int 
> >> qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
> >>              curr->next->value = gsconf;
> >>              curr = curr->next;
> >>          }
> >> +        gsconf = NULL;
> >>  
> >> -        qdict_del(backing_options, str);
> >> +        QDECREF(backing_options);
> >> +        backing_options = NULL;
> >>          g_free(str);
> >>          str = NULL;
> >>      }
> >> @@ -636,11 +637,10 @@ static int 
> >> qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
> >>  
> >>  out:
> >>      error_propagate(errp, local_err);
> >> +    qapi_free_GlusterServer(gsconf);
> >>      qemu_opts_del(opts);
> >> -    if (str) {
> >> -        qdict_del(backing_options, str);
> >> -        g_free(str);
> >> -    }
> >> +    g_free(str);
> >> +    QDECREF(backing_options);
> >>      errno = EINVAL;
> >>      return -errno;
> >>  }
> >> -- 
> >> 2.7.4
> >> 
> >> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]