From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59801) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WLIoZ-0005SV-5p for qemu-devel@nongnu.org; Wed, 05 Mar 2014 15:53:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WLIoT-0003sY-2k for qemu-devel@nongnu.org; Wed, 05 Mar 2014 15:53:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:65042) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WLIoS-0003rT-Pp for qemu-devel@nongnu.org; Wed, 05 Mar 2014 15:53:13 -0500 From: Stefan Hajnoczi Date: Wed, 5 Mar 2014 21:51:21 +0100 Message-Id: <1394052684-14362-3-git-send-email-stefanha@redhat.com> In-Reply-To: <1394052684-14362-1-git-send-email-stefanha@redhat.com> References: <1394052684-14362-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PATCH v3 2/5] qom: don't make link NULL on object_property_set_link() failure List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Andreas Faerber , Anthony Liguori , Peter Maydell 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: Stefan Hajnoczi --- qom/object.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/qom/object.c b/qom/object.c index 6e2443c..124d126 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1079,27 +1079,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); } -- 1.8.5.3