From patchwork Wed Feb 22 17:22:26 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: qom: In function object_set_link_property(), first call object_ref(), then object_unref(). Date: Wed, 22 Feb 2012 07:22:26 -0000 From: Alexander Barabash X-Patchwork-Id: 142512 Message-Id: <1329931346-28207-1-git-send-email-alexander_barabash@mentor.com> To: Cc: pbonzini@redhat.com, Alexander Barabash From: Alexander Barabash 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. Signed-off-by: Alexander Barabash Reviewed-by: Paolo Bonzini --- qom/object.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/qom/object.c b/qom/object.c index 941c291..e6591e1 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,