qom: Make object_child_foreach() safe for objects removal
authorAlexey Kardashevskiy <aik@ozlabs.ru>
Sun, 13 Jul 2014 14:41:08 +0000 (00:41 +1000)
committerAndreas Färber <afaerber@suse.de>
Thu, 4 Sep 2014 14:14:47 +0000 (16:14 +0200)
Current object_child_foreach() uses QTAILQ_FOREACH() to walk
through children and that makes children removal from the callback
impossible.

This makes object_child_foreach() use QTAILQ_FOREACH_SAFE().

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: Hu Tao <hutao@cn.fujitsu.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
qom/object.c

index 79bd0cc474b8f038c12b618f3c70edb8968d11d0..a298b32f8bb789ca4e693632ce8c50fc2f8c2c63 100644 (file)
@@ -668,10 +668,10 @@ void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
 int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque),
                          void *opaque)
 {
-    ObjectProperty *prop;
+    ObjectProperty *prop, *next;
     int ret = 0;
 
-    QTAILQ_FOREACH(prop, &obj->properties, node) {
+    QTAILQ_FOREACH_SAFE(prop, &obj->properties, node, next) {
         if (object_property_is_child(prop)) {
             ret = fn(prop->opaque, opaque);
             if (ret != 0) {