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

View File

@ -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);
gsconf = g_new0(GlusterServer, 1);
gsconf->type = qapi_enum_parse(GlusterTransport_lookup, ptr,
GLUSTER_TRANSPORT__MAX,
GLUSTER_TRANSPORT__MAX,
&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;
}
gsconf = g_new0(GlusterServer, 1);
gsconf->type = qapi_enum_parse(GlusterTransport_lookup, ptr,
GLUSTER_TRANSPORT__MAX, -1,
&local_err);
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;
}