From e40077fd2ccbf4ffa8d07f186110fac240a45bf9 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 30 May 2018 18:16:04 +0200 Subject: [PATCH] qom: support orphan objects in object_get_canonical_path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mostly a rewrite, in order to keep the loop simple. Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Paolo Bonzini --- qom/object.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/qom/object.c b/qom/object.c index 0fc972030e..cb7a8cd589 100644 --- a/qom/object.c +++ b/qom/object.c @@ -1669,25 +1669,29 @@ gchar *object_get_canonical_path(Object *obj) Object *root = object_get_root(); char *newpath, *path = NULL; - while (obj != root) { - char *component = object_get_canonical_path_component(obj); - - if (path) { - newpath = g_strdup_printf("%s/%s", component, path); - g_free(component); - g_free(path); - path = newpath; - } else { - path = component; - } - - obj = obj->parent; + if (obj == root) { + return g_strdup("/"); } - newpath = g_strdup_printf("/%s", path ? path : ""); - g_free(path); + do { + char *component = object_get_canonical_path_component(obj); - return newpath; + if (!component) { + /* A canonical path must be complete, so discard what was + * collected so far. + */ + g_free(path); + return NULL; + } + + newpath = g_strdup_printf("/%s%s", component, path ? path : ""); + g_free(path); + g_free(component); + path = newpath; + obj = obj->parent; + } while (obj != root); + + return path; } Object *object_resolve_path_component(Object *parent, const gchar *part)