From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47511) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUIWj-0000u1-1C for qemu-devel@nongnu.org; Tue, 25 Aug 2015 14:00:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZUIWg-0003xO-5R for qemu-devel@nongnu.org; Tue, 25 Aug 2015 14:00:52 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60334) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZUIWg-0003wi-1O for qemu-devel@nongnu.org; Tue, 25 Aug 2015 14:00:50 -0400 From: Markus Armbruster Date: Tue, 25 Aug 2015 20:00:46 +0200 Message-Id: <1440525646-22428-3-git-send-email-armbru@redhat.com> In-Reply-To: <1440525646-22428-1-git-send-email-armbru@redhat.com> References: <1440525646-22428-1-git-send-email-armbru@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v2 2/2] qom: Fix invalid error check in property_get_str() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: afaerber@suse.de, Anthony Liguori When a function returns a null pointer on error and only on error, you can do if (!foo(foos, errp)) { ... handle error ... } instead of the more cumbersome Error *err =3D NULL; if (!foo(foos, &err)) { error_propagate(errp, err); ... handle error ... } A StringProperty's getter, however, may return null on success! We then fail to call visit_type_str(). Screwed up in 6a146eb, v1.1. Fails tests/qom-test in my current, heavily hacked QAPI branch. No reproducer for master known (but I didn't look hard). Cc: Andreas F=C3=A4rber Cc: Anthony Liguori Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- qom/object.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/qom/object.c b/qom/object.c index 6173da8..4c4df55 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1591,14 +1591,18 @@ typedef struct StringProperty static void property_get_str(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) { + Error *err =3D NULL; StringProperty *prop =3D opaque; char *value; =20 - value =3D prop->get(obj, errp); - if (value) { - visit_type_str(v, &value, name, errp); - g_free(value); + value =3D prop->get(obj, &err); + if (err) { + error_propagate(errp, err); + return; } + + visit_type_str(v, &value, name, errp); + g_free(value); } =20 static void property_set_str(Object *obj, Visitor *v, void *opaque, --=20 2.4.3