libubus: process pending messages in data handler if stack depth is 0

Process pending messages before attempting to read new ones. After completing
the poll, process any remaining pending messages.

A previous message processing call which issued a request from within
its handler may have left behind more object messages to process.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2021-08-12 12:35:19 +02:00
parent 2099bb3ad9
commit ef038488ed

View file

@ -314,12 +314,20 @@ void __hidden ubus_handle_data(struct uloop_fd *u, unsigned int events)
struct ubus_context *ctx = container_of(u, struct ubus_context, sock);
int recv_fd = -1;
while (get_next_msg(ctx, &recv_fd)) {
while (1) {
if (!ctx->stack_depth)
ctx->pending_timer.cb(&ctx->pending_timer);
if (!get_next_msg(ctx, &recv_fd))
break;
ubus_process_msg(ctx, &ctx->msgbuf, recv_fd);
if (uloop_cancelling() || ctx->cancel_poll)
break;
}
if (!ctx->stack_depth)
ctx->pending_timer.cb(&ctx->pending_timer);
if (u->eof)
ctx->connection_lost(ctx);
}