diff mbox

[12/15] gluster: Plug memory leaks in qemu_gluster_parse_json()

Message ID 1488491046-2549-13-git-send-email-armbru@redhat.com
State New
Headers show

Commit Message

Markus Armbruster March 2, 2017, 9:44 p.m. UTC
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 <armbru@redhat.com>
---
 block/gluster.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

Comments

Niels de Vos March 3, 2017, 7:11 a.m. UTC | #1
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 <armbru@redhat.com>
> ---
>  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?

>                                         &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
> 
>
Markus Armbruster March 3, 2017, 7:38 a.m. UTC | #2
Niels de Vos <ndevos@redhat.com> 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 <armbru@redhat.com>
>> ---
>>  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.

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

>>                                         &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
>> 
>>
Niels de Vos March 3, 2017, 8:17 a.m. UTC | #3
On Fri, Mar 03, 2017 at 08:38:45AM +0100, Markus Armbruster wrote:
> Niels de Vos <ndevos@redhat.com> 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 <armbru@redhat.com>
> >> ---
> >>  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
> >> 
> >>
Markus Armbruster March 3, 2017, 8:35 a.m. UTC | #4
Niels de Vos <ndevos@redhat.com> writes:

> On Fri, Mar 03, 2017 at 08:38:45AM +0100, Markus Armbruster wrote:
>> Niels de Vos <ndevos@redhat.com> 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 <armbru@redhat.com>
>> >> ---
>> >>  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!

I'll change it.

May I add your R-by then?
Niels de Vos March 3, 2017, 5:06 p.m. UTC | #5
On Fri, Mar 03, 2017 at 09:35:16AM +0100, Markus Armbruster wrote:
> Niels de Vos <ndevos@redhat.com> writes:
> 
> > On Fri, Mar 03, 2017 at 08:38:45AM +0100, Markus Armbruster wrote:
> >> Niels de Vos <ndevos@redhat.com> 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 <armbru@redhat.com>
> >> >> ---
> >> >>  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!
> 
> I'll change it.
> 
> May I add your R-by then?

Yes, of course.

Thanks,
Niels
diff mbox

Patch

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,
                                        &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;
 }