From f0cdc966fb8998bc6acc15fbd360e52061495557 Mon Sep 17 00:00:00 2001 From: Alexander Barabash Date: Wed, 22 Feb 2012 19:22:26 +0200 Subject: qom: In function object_set_link_property(), first call object_ref(), then object_unref(). In the old implementation, if the new value of the property links to the same object, as the old value, that object is first unref-ed, and then ref-ed. This leads to unintended deinitialization of that object. In the new implementation, this is fixed. Reviewed-by: Paolo Bonzini Signed-off-by: Alexander Barabash Signed-off-by: Anthony Liguori --- qom/object.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'qom/object.c') diff --git a/qom/object.c b/qom/object.c index d858c04705..aa037d299f 100644 --- a/qom/object.c +++ b/qom/object.c @@ -892,6 +892,7 @@ static void object_set_link_property(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) { Object **child = opaque; + Object *old_target; bool ambiguous = false; const char *type; char *path; @@ -901,10 +902,8 @@ static void object_set_link_property(Object *obj, Visitor *v, void *opaque, visit_type_str(v, &path, name, errp); - if (*child) { - object_unref(*child); - *child = NULL; - } + old_target = *child; + *child = NULL; if (strcmp(path, "") != 0) { Object *target; @@ -930,6 +929,10 @@ static void object_set_link_property(Object *obj, Visitor *v, void *opaque, } g_free(path); + + if (old_target != NULL) { + object_unref(old_target); + } } void object_property_add_link(Object *obj, const char *name, -- cgit v1.2.1