From dd3afa517d4fefaadee9fcefefd2e503e251e909 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 11 May 2013 20:39:54 +0200 Subject: [PATCH] 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 --- libubus-req.c | 2 ++ 1 file changed, 2 insertions(+) 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); -- 2.11.0