OSDN Git Service

qom: support orphan objects in object_get_canonical_path
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 30 May 2018 16:16:04 +0000 (18:16 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 1 Jun 2018 12:15:10 +0000 (14:15 +0200)
Mostly a rewrite, in order to keep the loop simple.

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
qom/object.c

index 0fc9720..cb7a8cd 100644 (file)
@@ -1669,25 +1669,29 @@ gchar *object_get_canonical_path(Object *obj)
     Object *root = object_get_root();
     char *newpath, *path = NULL;
 
-    while (obj != root) {
+    if (obj == root) {
+        return g_strdup("/");
+    }
+
+    do {
         char *component = object_get_canonical_path_component(obj);
 
-        if (path) {
-            newpath = g_strdup_printf("%s/%s", component, path);
-            g_free(component);
+        if (!component) {
+            /* A canonical path must be complete, so discard what was
+             * collected so far.
+             */
             g_free(path);
-            path = newpath;
-        } else {
-            path = component;
+            return NULL;
         }
 
+        newpath = g_strdup_printf("/%s%s", component, path ? path : "");
+        g_free(path);
+        g_free(component);
+        path = newpath;
         obj = obj->parent;
-    }
-
-    newpath = g_strdup_printf("/%s", path ? path : "");
-    g_free(path);
+    } while (obj != root);
 
-    return newpath;
+    return path;
 }
 
 Object *object_resolve_path_component(Object *parent, const gchar *part)