summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2021-08-09 12:49:34 +0200
committerPetr Štetiar <ynezz@true.cz>2022-02-15 18:10:07 +0100
commitc3f3e194870973a888cabc7129f6f8ec0c3cccee (patch)
treebebf6e45a73ad4c0fdd2b8a5c5e94e06ba29654f
parent38c7fdd8991366cd2f9ccbc47625f9b51b1d318a (diff)
downloadubus-c3f3e194870973a888cabc7129f6f8ec0c3cccee.tar.gz
libubus: use list_empty/list_first_entry in ubus_process_pending_msg
Simplifies checks and avoids potential list corruption on recursive calls Signed-off-by: Felix Fietkau <nbd@nbd.name> (cherry picked from commit 2099bb3ad9972c6188c38fd885ae74f3323fcacc)
-rw-r--r--libubus.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/libubus.c b/libubus.c
index 91f317c..7ce454e 100644
--- a/libubus.c
+++ b/libubus.c
@@ -115,12 +115,13 @@ ubus_process_msg(struct ubus_context *ctx, struct ubus_msghdr_buf *buf, int fd)
static void ubus_process_pending_msg(struct uloop_timeout *timeout)
{
struct ubus_context *ctx = container_of(timeout, struct ubus_context, pending_timer);
- struct ubus_pending_msg *pending, *tmp;
+ struct ubus_pending_msg *pending;
- list_for_each_entry_safe(pending, tmp, &ctx->pending, list) {
+ while (!list_empty(&ctx->pending)) {
if (ctx->stack_depth)
break;
+ pending = list_first_entry(&ctx->pending, struct ubus_pending_msg, list);
list_del(&pending->list);
ubus_process_msg(ctx, &pending->hdr, -1);
free(pending);