Skip to content

Commit feb6a46

Browse files
committed
[BUGFIX] LWIP system mailbox overflow fix
1 parent 7b0a3dc commit feb6a46

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

features/lwipstack/lwip-sys/arch/lwip_sys_arch.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ u32_t sys_now(void) {
116116
/* CMSIS-RTOS implementation of the lwip operating system abstraction */
117117
#include "arch/sys_arch.h"
118118

119+
/* modulus subtract: (a - b) mod m, where a, b belongs to mod m ring */
120+
#define SUB_MOD(a, b, m) ((a) >= (b) ? (a) - (b) : (m) - (b) + (a))
121+
119122
/*---------------------------------------------------------------------------*
120123
* Routine: sys_mbox_new
121124
*---------------------------------------------------------------------------*
@@ -174,11 +177,11 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
174177

175178
int state = osKernelLock();
176179

177-
mbox->queue[mbox->post_idx % MB_SIZE] = msg;
178-
mbox->post_idx += 1;
180+
mbox->queue[mbox->post_idx] = msg;
181+
mbox->post_idx = (mbox->post_idx + 1) % MB_SIZE;
179182

180183
osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT);
181-
if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1)
184+
if (SUB_MOD(mbox->post_idx, mbox->fetch_idx, MB_SIZE) >= MB_SIZE-1)
182185
osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT);
183186

184187
osKernelRestoreLock(state);
@@ -207,11 +210,11 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
207210

208211
int state = osKernelLock();
209212

210-
mbox->queue[mbox->post_idx % MB_SIZE] = msg;
211-
mbox->post_idx += 1;
213+
mbox->queue[mbox->post_idx] = msg;
214+
mbox->post_idx = (mbox->post_idx + 1) % MB_SIZE;
212215

213216
osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT);
214-
if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1)
217+
if (SUB_MOD(mbox->post_idx, mbox->fetch_idx, MB_SIZE) >= MB_SIZE-1)
215218
osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT);
216219

217220
osKernelRestoreLock(state);
@@ -261,8 +264,8 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
261264
int state = osKernelLock();
262265

263266
if (msg)
264-
*msg = mbox->queue[mbox->fetch_idx % MB_SIZE];
265-
mbox->fetch_idx += 1;
267+
*msg = mbox->queue[mbox->fetch_idx];
268+
mbox->fetch_idx = (mbox->fetch_idx + 1) % MB_SIZE;
266269

267270
osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT);
268271
if (mbox->post_idx == mbox->fetch_idx)
@@ -297,8 +300,8 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {
297300
int state = osKernelLock();
298301

299302
if (msg)
300-
*msg = mbox->queue[mbox->fetch_idx % MB_SIZE];
301-
mbox->fetch_idx += 1;
303+
*msg = mbox->queue[mbox->fetch_idx];
304+
mbox->fetch_idx = (mbox->fetch_idx + 1) % MB_SIZE;
302305

303306
osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT);
304307
if (mbox->post_idx == mbox->fetch_idx)

0 commit comments

Comments
 (0)