gluster: Plug memory leaks in qemu_gluster_parse_json()

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>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Markus Armbruster 2017-03-06 20:00:46 +01:00 committed by Kevin Wolf
parent e152ef7a98
commit 85a82e852d
1 changed files with 11 additions and 11 deletions

View File

@ -480,7 +480,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
QDict *options, Error **errp) QDict *options, Error **errp)
{ {
QemuOpts *opts; QemuOpts *opts;
GlusterServer *gsconf; GlusterServer *gsconf = NULL;
GlusterServerList *curr = NULL; GlusterServerList *curr = NULL;
QDict *backing_options = NULL; QDict *backing_options = NULL;
Error *local_err = 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); ptr = qemu_opt_get(opts, GLUSTER_OPT_TYPE);
gsconf = g_new0(GlusterServer, 1);
gsconf->type = qapi_enum_parse(GlusterTransport_lookup, ptr,
GLUSTER_TRANSPORT__MAX,
GLUSTER_TRANSPORT__MAX,
&local_err);
if (!ptr) { if (!ptr) {
error_setg(&local_err, QERR_MISSING_PARAMETER, GLUSTER_OPT_TYPE); error_setg(&local_err, QERR_MISSING_PARAMETER, GLUSTER_OPT_TYPE);
error_append_hint(&local_err, GERR_INDEX_HINT, i); error_append_hint(&local_err, GERR_INDEX_HINT, i);
goto out; goto out;
} }
gsconf = g_new0(GlusterServer, 1);
gsconf->type = qapi_enum_parse(GlusterTransport_lookup, ptr,
GLUSTER_TRANSPORT__MAX, -1,
&local_err);
if (local_err) { if (local_err) {
error_append_hint(&local_err, error_append_hint(&local_err,
"Parameter '%s' may be 'tcp' or 'unix'\n", "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->next->value = gsconf;
curr = curr->next; curr = curr->next;
} }
gsconf = NULL;
qdict_del(backing_options, str); QDECREF(backing_options);
backing_options = NULL;
g_free(str); g_free(str);
str = NULL; str = NULL;
} }
@ -636,11 +637,10 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
out: out:
error_propagate(errp, local_err); error_propagate(errp, local_err);
qapi_free_GlusterServer(gsconf);
qemu_opts_del(opts); qemu_opts_del(opts);
if (str) { g_free(str);
qdict_del(backing_options, str); QDECREF(backing_options);
g_free(str);
}
errno = EINVAL; errno = EINVAL;
return -errno; return -errno;
} }