Patchwork [v1,1/1] qom/object: Don't poll cast cache for NULL objects

login
register
mail settings
Submitter Peter Crosthwaite
Date May 21, 2013, 6:05 a.m.
Message ID <feaf19cbe63980b483e31d91a0c1e2bb433eae37.1369115958.git.peter.crosthwaite@xilinx.com>
Download mbox | patch
Permalink /patch/245196/
State New
Headers show

Comments

Peter Crosthwaite - May 21, 2013, 6:05 a.m.
From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

object_dymamic_cast_assert used to be tolerant of NULL objects and not
assert. Its clear from the implementation that this is the expected
behavior.

The preceding check of the cast cache dereferences obj however causing
a segfault. Fix by conditionalizing the cast cache logic on obj being
non-null.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---

 qom/object.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Andreas Färber - May 21, 2013, 11:36 a.m.
Am 21.05.2013 08:05, schrieb peter.crosthwaite@xilinx.com:
> From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> 
> object_dymamic_cast_assert used to be tolerant of NULL objects and not

"dynamic"

> assert. Its clear from the implementation that this is the expected

"It's"

> behavior.
> 
> The preceding check of the cast cache dereferences obj however causing
> a segfault. Fix by conditionalizing the cast cache logic on obj being
> non-null.
> 
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Otherwise,

Reviewed-by: Andreas Färber <afaerber@suse.de>

Andreas

> ---
> 
>  qom/object.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/qom/object.c b/qom/object.c
> index ec88231..803b94b 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -442,7 +442,7 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename,
>      int i;
>      Object *inst;
>  
> -    for (i = 0; i < OBJECT_CLASS_CAST_CACHE; i++) {
> +    for (i = 0; obj && i < OBJECT_CLASS_CAST_CACHE; i++) {
>          if (obj->class->cast_cache[i] == typename) {
>              goto out;
>          }
> @@ -458,7 +458,7 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename,
>  
>      assert(obj == inst);
>  
> -    if (obj == inst) {
> +    if (obj && obj == inst) {
>          for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) {
>              obj->class->cast_cache[i - 1] = obj->class->cast_cache[i];
>          }
>
Anthony Liguori - May 21, 2013, 12:01 p.m.
peter.crosthwaite@xilinx.com writes:

> From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
>
> object_dymamic_cast_assert used to be tolerant of NULL objects and not
> assert. Its clear from the implementation that this is the expected
> behavior.
>
> The preceding check of the cast cache dereferences obj however causing
> a segfault. Fix by conditionalizing the cast cache logic on obj being
> non-null.
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> ---
>
>  qom/object.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/qom/object.c b/qom/object.c
> index ec88231..803b94b 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -442,7 +442,7 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename,
>      int i;
>      Object *inst;
>  
> -    for (i = 0; i < OBJECT_CLASS_CAST_CACHE; i++) {
> +    for (i = 0; obj && i < OBJECT_CLASS_CAST_CACHE; i++) {
>          if (obj->class->cast_cache[i] == typename) {
>              goto out;
>          }
> @@ -458,7 +458,7 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename,
>  
>      assert(obj == inst);
>  
> -    if (obj == inst) {
> +    if (obj && obj == inst) {
>          for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) {
>              obj->class->cast_cache[i - 1] = obj->class->cast_cache[i];
>          }
> -- 
> 1.8.3.rc1.44.gb387c77.dirty

Patch

diff --git a/qom/object.c b/qom/object.c
index ec88231..803b94b 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -442,7 +442,7 @@  Object *object_dynamic_cast_assert(Object *obj, const char *typename,
     int i;
     Object *inst;
 
-    for (i = 0; i < OBJECT_CLASS_CAST_CACHE; i++) {
+    for (i = 0; obj && i < OBJECT_CLASS_CAST_CACHE; i++) {
         if (obj->class->cast_cache[i] == typename) {
             goto out;
         }
@@ -458,7 +458,7 @@  Object *object_dynamic_cast_assert(Object *obj, const char *typename,
 
     assert(obj == inst);
 
-    if (obj == inst) {
+    if (obj && obj == inst) {
         for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) {
             obj->class->cast_cache[i - 1] = obj->class->cast_cache[i];
         }