From: Felix Fietkau Date: Sat, 11 May 2013 18:39:54 +0000 (+0200) Subject: libubus: fix deadlock in recursive synchronous ubus requests X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubus.git;a=commitdiff_plain;h=dd3afa517d4fefaadee9fcefefd2e503e251e909 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 --- diff --git a/libubus-req.c b/libubus-req.c index f02af8e..2f2dce1 100644 --- a/libubus-req.c +++ b/libubus-req.c @@ -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);