Message ID | 1435765624-18404-3-git-send-email-armbru@redhat.com |
---|---|
State | New |
Headers | show |
On 07/01/2015 09:47 AM, Markus Armbruster wrote: > 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 = 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ärber <afaerber@suse.de> > Cc: Anthony Liguori <aliguori@us.ibm.com> > Signed-off-by: Markus Armbruster <armbru@redhat.com> > --- > qom/object.c | 12 ++++++++---- > 1 file changed, 8 insertions(+), 4 deletions(-) > Reviewed-by: Eric Blake <eblake@redhat.com> > 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 = NULL; > StringProperty *prop = opaque; > char *value; > > - value = prop->get(obj, errp); > - if (value) { > - visit_type_str(v, &value, name, errp); > - g_free(value); > + value = prop->get(obj, &err); > + if (err) { > + error_propagate(errp, err); > + return; > } > + > + visit_type_str(v, &value, name, errp); > + g_free(value); > } > > static void property_set_str(Object *obj, Visitor *v, void *opaque, >
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 = NULL; StringProperty *prop = opaque; char *value; - value = prop->get(obj, errp); - if (value) { - visit_type_str(v, &value, name, errp); - g_free(value); + value = prop->get(obj, &err); + if (err) { + error_propagate(errp, err); + return; } + + visit_type_str(v, &value, name, errp); + g_free(value); } static void property_set_str(Object *obj, Visitor *v, void *opaque,
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 = 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ärber <afaerber@suse.de> Cc: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> --- qom/object.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)