[BUGFIX] LWIP system mailbox overflow fix

pull/11976/head
Piotr Stolarz 2019-11-28 14:32:36 +01:00
parent 7b0a3dcebd
commit feb6a46619
1 changed files with 13 additions and 10 deletions

View File

@ -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)