Commit c6aed983 authored by Stefan Hajnoczi's avatar Stefan Hajnoczi Committed by Andreas Färber
Browse files

qom: Don't make link NULL on object_property_set_link() failure



The error behavior of object_property_set_link() is dangerous.  It sets
the link property object to NULL if an error occurs.  A setter function
should either succeed or fail, it shouldn't leave the value NULL on
failure.

Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarAndreas Färber <afaerber@suse.de>
parent f5ec6704
Loading
Loading
Loading
Loading
+15 −14
Original line number Diff line number Diff line
@@ -1080,27 +1080,28 @@ static Object *object_resolve_link(Object *obj, const char *name,
static void object_set_link_property(Object *obj, Visitor *v, void *opaque,
                                     const char *name, Error **errp)
{
    Error *local_err = NULL;
    Object **child = opaque;
    Object *old_target;
    char *path;

    visit_type_str(v, &path, name, errp);
    Object *old_target = *child;
    Object *new_target = NULL;
    char *path = NULL;

    old_target = *child;
    *child = NULL;
    visit_type_str(v, &path, name, &local_err);

    if (strcmp(path, "") != 0) {
        Object *target;

        target = object_resolve_link(obj, name, path, errp);
        if (target) {
            object_ref(target);
            *child = target;
        }
    if (!local_err && strcmp(path, "") != 0) {
        new_target = object_resolve_link(obj, name, path, &local_err);
    }

    g_free(path);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }

    if (new_target) {
        object_ref(new_target);
    }
    *child = new_target;
    if (old_target != NULL) {
        object_unref(old_target);
    }