libubus: fix deadlock in recursive synchronous ubus requests

When synchronous request completion loops are running, the innermost
loop can receive events that can unblock the outer loops, however the
loop clears uloop_cancelled (which is set by the request completion).

This causes the event loop to continue running even while a completion
loop has already been unblocked.

Fix this by not clearing uloop_cancelled for inner loops

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
This commit is contained in:
Felix Fietkau 2013-05-11 20:39:54 +02:00
parent 90037b772c
commit dd3afa517d

View file

@ -157,6 +157,8 @@ int ubus_complete_request(struct ubus_context *ctx, struct ubus_request *req,
uloop_cancelled = cancelled;
}
ctx->stack_depth--;
if (ctx->stack_depth)
uloop_cancelled = true;
if (timeout)
uloop_timeout_cancel(&cb.timeout);