qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH for-2.4 0/2] qom: Fix misuse of Error API
@ 2015-07-01 15:47 Markus Armbruster
  2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 1/2] qom: Do not reuse errp after a possible error Markus Armbruster
  2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 2/2] qom: Fix invalid error check in property_get_str() Markus Armbruster
  0 siblings, 2 replies; 5+ messages in thread
From: Markus Armbruster @ 2015-07-01 15:47 UTC (permalink / raw)
  To: qemu-devel

Most of the bugs are fairly old, and we may decide to let sleeping
dogs lie this close to a release.  Maintainer's discretion, tagging
for-2.4 just to make sure the fixes are considered.

Markus Armbruster (2):
  qom: Do not reuse errp after a possible error
  qom: Fix invalid error check in property_get_str()

 qom/object.c | 53 +++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 43 insertions(+), 10 deletions(-)

-- 
1.9.3

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH for-2.4 1/2] qom: Do not reuse errp after a possible error
  2015-07-01 15:47 [Qemu-devel] [PATCH for-2.4 0/2] qom: Fix misuse of Error API Markus Armbruster
@ 2015-07-01 15:47 ` Markus Armbruster
  2015-07-01 16:03   ` Daniel P. Berrange
  2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 2/2] qom: Fix invalid error check in property_get_str() Markus Armbruster
  1 sibling, 1 reply; 5+ messages in thread
From: Markus Armbruster @ 2015-07-01 15:47 UTC (permalink / raw)
  To: qemu-devel
  Cc: "Tao <hutao", Anthony Liguori, Andreas Färber, Hu

The argument for an Error **errp parameter must point to a null
pointer.  If it doesn't, and an error happens, error_set() fails its
assertion.

Instead of

    foo(foos, errp);
    bar(bars, errp);

you need to do something like

    Error *err = NULL;

    foo(foos, &err);
    if (err) {
        error_propagate(errp, err);
        goto out;
    }

    bar(bars, errp);
out:

Screwed up in commit 0e55884 (v1.3.0): property_get_bool().

Screwed up in commit 1f21772 (v2.1.0): object_property_get_enum() and
object_property_get_uint16List().

Screwed up in commit a8e3fbe (not yet released): property_get_enum(),
property_set_enum().

Found by inspection, no actual crashes observed.

Fix them up.

Cc: Andreas Färber <afaerber@suse.de>
Cc: Anthony Liguori <aliguori@us.ibm.com>
Cc: Hu Tao <hutao@cn.fujitsu.com
Cc: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qom/object.c | 41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index eea8edf..6173da8 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1079,6 +1079,7 @@ typedef struct EnumProperty {
 int object_property_get_enum(Object *obj, const char *name,
                              const char *typename, Error **errp)
 {
+    Error *err = NULL;
     StringOutputVisitor *sov;
     StringInputVisitor *siv;
     char *str;
@@ -1100,7 +1101,12 @@ int object_property_get_enum(Object *obj, const char *name,
     enumprop = prop->opaque;
 
     sov = string_output_visitor_new(false);
-    object_property_get(obj, string_output_get_visitor(sov), name, errp);
+    object_property_get(obj, string_output_get_visitor(sov), name, &err);
+    if (err) {
+        error_propagate(errp, err);
+        string_output_visitor_cleanup(sov);
+        return 0;
+    }
     str = string_output_get_string(sov);
     siv = string_input_visitor_new(str);
     string_output_visitor_cleanup(sov);
@@ -1116,21 +1122,27 @@ int object_property_get_enum(Object *obj, const char *name,
 void object_property_get_uint16List(Object *obj, const char *name,
                                     uint16List **list, Error **errp)
 {
+    Error *err = NULL;
     StringOutputVisitor *ov;
     StringInputVisitor *iv;
     char *str;
 
     ov = string_output_visitor_new(false);
     object_property_get(obj, string_output_get_visitor(ov),
-                        name, errp);
+                        name, &err);
+    if (err) {
+        error_propagate(errp, err);
+        goto out;
+    }
     str = string_output_get_string(ov);
     iv = string_input_visitor_new(str);
     visit_type_uint16List(string_input_get_visitor(iv),
                           list, NULL, errp);
 
     g_free(str);
-    string_output_visitor_cleanup(ov);
     string_input_visitor_cleanup(iv);
+out:
+    string_output_visitor_cleanup(ov);
 }
 
 void object_property_parse(Object *obj, const char *string,
@@ -1644,10 +1656,16 @@ typedef struct BoolProperty
 static void property_get_bool(Object *obj, Visitor *v, void *opaque,
                               const char *name, Error **errp)
 {
+    Error *err = NULL;
     BoolProperty *prop = opaque;
     bool value;
 
-    value = prop->get(obj, errp);
+    value = prop->get(obj, &err);
+    if (err) {
+        error_propagate(errp, err);
+        return;
+    }
+
     visit_type_bool(v, &value, name, errp);
 }
 
@@ -1699,20 +1717,31 @@ void object_property_add_bool(Object *obj, const char *name,
 static void property_get_enum(Object *obj, Visitor *v, void *opaque,
                               const char *name, Error **errp)
 {
+    Error *err = NULL;
     EnumProperty *prop = opaque;
     int value;
 
-    value = prop->get(obj, errp);
+    value = prop->get(obj, &err);
+    if (err) {
+        error_propagate(errp, err);
+        return;
+    }
+
     visit_type_enum(v, &value, prop->strings, NULL, name, errp);
 }
 
 static void property_set_enum(Object *obj, Visitor *v, void *opaque,
                               const char *name, Error **errp)
 {
+    Error *err = NULL;
     EnumProperty *prop = opaque;
     int value;
 
-    visit_type_enum(v, &value, prop->strings, NULL, name, errp);
+    visit_type_enum(v, &value, prop->strings, NULL, name, &err);
+    if (err) {
+        error_propagate(errp, err);
+        return;
+    }
     prop->set(obj, value, errp);
 }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH for-2.4 2/2] qom: Fix invalid error check in property_get_str()
  2015-07-01 15:47 [Qemu-devel] [PATCH for-2.4 0/2] qom: Fix misuse of Error API Markus Armbruster
  2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 1/2] qom: Do not reuse errp after a possible error Markus Armbruster
@ 2015-07-01 15:47 ` Markus Armbruster
  2015-07-20 15:20   ` Eric Blake
  1 sibling, 1 reply; 5+ messages in thread
From: Markus Armbruster @ 2015-07-01 15:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: Anthony Liguori, Andreas Färber

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(-)

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,
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.4 1/2] qom: Do not reuse errp after a possible error
  2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 1/2] qom: Do not reuse errp after a possible error Markus Armbruster
@ 2015-07-01 16:03   ` Daniel P. Berrange
  0 siblings, 0 replies; 5+ messages in thread
From: Daniel P. Berrange @ 2015-07-01 16:03 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: Hu, Anthony Liguori, qemu-devel, Andreas Färber

On Wed, Jul 01, 2015 at 05:47:03PM +0200, Markus Armbruster wrote:
> The argument for an Error **errp parameter must point to a null
> pointer.  If it doesn't, and an error happens, error_set() fails its
> assertion.
> 
> Instead of
> 
>     foo(foos, errp);
>     bar(bars, errp);
> 
> you need to do something like
> 
>     Error *err = NULL;
> 
>     foo(foos, &err);
>     if (err) {
>         error_propagate(errp, err);
>         goto out;
>     }
> 
>     bar(bars, errp);
> out:
> 
> Screwed up in commit 0e55884 (v1.3.0): property_get_bool().
> 
> Screwed up in commit 1f21772 (v2.1.0): object_property_get_enum() and
> object_property_get_uint16List().
> 
> Screwed up in commit a8e3fbe (not yet released): property_get_enum(),
> property_set_enum().
> 
> Found by inspection, no actual crashes observed.
> 
> Fix them up.
> 
> Cc: Andreas Färber <afaerber@suse.de>
> Cc: Anthony Liguori <aliguori@us.ibm.com>
> Cc: Hu Tao <hutao@cn.fujitsu.com
> Cc: Daniel P. Berrange <berrange@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Looks good to me.

Reviewed-by: Daniel P. Berrange <berrange@redhat.com>

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.4 2/2] qom: Fix invalid error check in property_get_str()
  2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 2/2] qom: Fix invalid error check in property_get_str() Markus Armbruster
@ 2015-07-20 15:20   ` Eric Blake
  0 siblings, 0 replies; 5+ messages in thread
From: Eric Blake @ 2015-07-20 15:20 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Anthony Liguori, Andreas Färber

[-- Attachment #1: Type: text/plain, Size: 1919 bytes --]

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,
> 

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-07-20 15:20 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-01 15:47 [Qemu-devel] [PATCH for-2.4 0/2] qom: Fix misuse of Error API Markus Armbruster
2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 1/2] qom: Do not reuse errp after a possible error Markus Armbruster
2015-07-01 16:03   ` Daniel P. Berrange
2015-07-01 15:47 ` [Qemu-devel] [PATCH for-2.4 2/2] qom: Fix invalid error check in property_get_str() Markus Armbruster
2015-07-20 15:20   ` Eric Blake

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).