From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48593) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKqKb-0000a3-A8 for qemu-devel@nongnu.org; Tue, 04 Mar 2014 09:28:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WKqKV-00031n-4m for qemu-devel@nongnu.org; Tue, 04 Mar 2014 09:28:29 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42909) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WKqKU-00031U-Qy for qemu-devel@nongnu.org; Tue, 04 Mar 2014 09:28:23 -0500 From: Stefan Hajnoczi Date: Tue, 4 Mar 2014 15:28:18 +0100 Message-Id: <1393943298-5938-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PATCH] qom: avoid leaking str and bool properties on failure List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Andreas Faerber When object_property_add_str() and object_property_add_bool() fail, they leak their internal StringProperty and BoolProperty structs. Remember to free the structs on error. Luckily this is a low-impact memory leak since most QOM properties are static qdev properties that will never take the error case. object_property_add() only fails if the property name is already in use. Signed-off-by: Stefan Hajnoczi --- qom/object.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/qom/object.c b/qom/object.c index 660859c..c88909c 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1293,6 +1293,7 @@ void object_property_add_str(Object *obj, const char *name, void (*set)(Object *, const char *, Error **), Error **errp) { + Error *local_err = NULL; StringProperty *prop = g_malloc0(sizeof(*prop)); prop->get = get; @@ -1302,7 +1303,11 @@ void object_property_add_str(Object *obj, const char *name, get ? property_get_str : NULL, set ? property_set_str : NULL, property_release_str, - prop, errp); + prop, &local_err); + if (local_err) { + error_propagate(errp, local_err); + g_free(prop); + } } typedef struct BoolProperty @@ -1349,6 +1354,7 @@ void object_property_add_bool(Object *obj, const char *name, void (*set)(Object *, bool, Error **), Error **errp) { + Error *local_err = NULL; BoolProperty *prop = g_malloc0(sizeof(*prop)); prop->get = get; @@ -1358,7 +1364,11 @@ void object_property_add_bool(Object *obj, const char *name, get ? property_get_bool : NULL, set ? property_set_bool : NULL, property_release_bool, - prop, errp); + prop, &local_err); + if (local_err) { + error_propagate(errp, local_err); + g_free(prop); + } } static char *qdev_get_type(Object *obj, Error **errp) -- 1.8.5.3