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:
parent
90037b772c
commit
dd3afa517d
1 changed files with 2 additions and 0 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue