From 62bfc16a092cd488fa89030c8215da5c8eaa82fc Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 8 Aug 2013 22:14:27 +0200 Subject: [PATCH] libubus: fix publishing objects after reconnect Signed-off-by: Felix Fietkau --- libubus-io.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libubus-io.c b/libubus-io.c index 1f7b0fb..589ba20 100644 --- a/libubus-io.c +++ b/libubus-io.c @@ -190,6 +190,8 @@ static void ubus_refresh_state(struct ubus_context *ctx) { struct ubus_object *obj, *tmp; + struct ubus_object **objs; + int n, i = 0; /* clear all type IDs, they need to be registered again */ avl_for_each_element(&ctx->objects, obj, avl) @@ -197,11 +199,14 @@ ubus_refresh_state(struct ubus_context *ctx) obj->type->id = 0; /* push out all objects again */ - avl_for_each_element_safe(&ctx->objects, obj, avl, tmp) { + objs = alloca(ctx->objects.count * sizeof(*objs)); + avl_remove_all_elements(&ctx->objects, obj, avl, tmp) { + objs[i++] = obj; obj->id = 0; - avl_delete(&ctx->objects, &obj->avl); - ubus_add_object(ctx, obj); } + + for (n = i, i = 0; i < n; i++) + ubus_add_object(ctx, objs[i]); } int ubus_reconnect(struct ubus_context *ctx, const char *path)