Commit 85a82e85 authored by Markus Armbruster's avatar Markus Armbruster Committed by Kevin Wolf
Browse files

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: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarNiels de Vos <ndevos@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent e152ef7a
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -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);
    }
    QDECREF(backing_options);
    errno = EINVAL;
    return -errno;
}