From feb6a466192ebeace121cd4ebb15cc0e0437d138 Mon Sep 17 00:00:00 2001 From: Piotr Stolarz Date: Thu, 28 Nov 2019 14:32:36 +0100 Subject: [PATCH] [BUGFIX] LWIP system mailbox overflow fix --- .../lwipstack/lwip-sys/arch/lwip_sys_arch.c | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/features/lwipstack/lwip-sys/arch/lwip_sys_arch.c b/features/lwipstack/lwip-sys/arch/lwip_sys_arch.c index d8fa1901ed..7cdb03132a 100644 --- a/features/lwipstack/lwip-sys/arch/lwip_sys_arch.c +++ b/features/lwipstack/lwip-sys/arch/lwip_sys_arch.c @@ -116,6 +116,9 @@ u32_t sys_now(void) { /* CMSIS-RTOS implementation of the lwip operating system abstraction */ #include "arch/sys_arch.h" +/* modulus subtract: (a - b) mod m, where a, b belongs to mod m ring */ +#define SUB_MOD(a, b, m) ((a) >= (b) ? (a) - (b) : (m) - (b) + (a)) + /*---------------------------------------------------------------------------* * Routine: sys_mbox_new *---------------------------------------------------------------------------* @@ -174,11 +177,11 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) { int state = osKernelLock(); - mbox->queue[mbox->post_idx % MB_SIZE] = msg; - mbox->post_idx += 1; + mbox->queue[mbox->post_idx] = msg; + mbox->post_idx = (mbox->post_idx + 1) % MB_SIZE; osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT); - if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1) + if (SUB_MOD(mbox->post_idx, mbox->fetch_idx, MB_SIZE) >= MB_SIZE-1) osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT); osKernelRestoreLock(state); @@ -207,11 +210,11 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) { int state = osKernelLock(); - mbox->queue[mbox->post_idx % MB_SIZE] = msg; - mbox->post_idx += 1; + mbox->queue[mbox->post_idx] = msg; + mbox->post_idx = (mbox->post_idx + 1) % MB_SIZE; osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT); - if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1) + if (SUB_MOD(mbox->post_idx, mbox->fetch_idx, MB_SIZE) >= MB_SIZE-1) osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT); osKernelRestoreLock(state); @@ -261,8 +264,8 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) { int state = osKernelLock(); if (msg) - *msg = mbox->queue[mbox->fetch_idx % MB_SIZE]; - mbox->fetch_idx += 1; + *msg = mbox->queue[mbox->fetch_idx]; + mbox->fetch_idx = (mbox->fetch_idx + 1) % MB_SIZE; osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT); if (mbox->post_idx == mbox->fetch_idx) @@ -297,8 +300,8 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) { int state = osKernelLock(); if (msg) - *msg = mbox->queue[mbox->fetch_idx % MB_SIZE]; - mbox->fetch_idx += 1; + *msg = mbox->queue[mbox->fetch_idx]; + mbox->fetch_idx = (mbox->fetch_idx + 1) % MB_SIZE; osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT); if (mbox->post_idx == mbox->fetch_idx)