Skip to content

Commit 626ca31

Browse files
committed
fix(ipc): check overflow before modifying IPC state in send functions
_rt_mb_send_wait, _rt_mq_send_wait, and rt_mq_urgent modified mailbox and message queue data structures before checking overflow conditions. On overflow, they returned errors without rolling back changes, causing state corruption. Moved overflow checks before state modifications so the data structures stay consistent on the error path. Signed-off-by: Srikanth Patchava <srpatcha@users.noreply.github.com>
1 parent ef9d8f4 commit 626ca31

1 file changed

Lines changed: 31 additions & 30 deletions

File tree

src/ipc.c

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2661,23 +2661,21 @@ static rt_err_t _rt_mb_send_wait(rt_mailbox_t mb,
26612661
}
26622662
}
26632663

2664+
if(mb->entry >= RT_MB_ENTRY_MAX)
2665+
{
2666+
rt_spin_unlock_irqrestore(&(mb->spinlock), level);
2667+
return -RT_EFULL; /* value overflowed */
2668+
}
2669+
26642670
/* set ptr */
26652671
mb->msg_pool[mb->in_offset] = value;
26662672
/* increase input offset */
26672673
++ mb->in_offset;
26682674
if (mb->in_offset >= mb->size)
26692675
mb->in_offset = 0;
26702676

2671-
if(mb->entry < RT_MB_ENTRY_MAX)
2672-
{
2673-
/* increase message entry */
2674-
mb->entry ++;
2675-
}
2676-
else
2677-
{
2678-
rt_spin_unlock_irqrestore(&(mb->spinlock), level);
2679-
return -RT_EFULL; /* value overflowed */
2680-
}
2677+
/* increase message entry */
2678+
mb->entry ++;
26812679

26822680
/* resume suspended thread */
26832681
if (!rt_list_isempty(&mb->parent.suspend_thread))
@@ -3503,6 +3501,16 @@ static rt_err_t _rt_mq_send_wait(rt_mq_t mq,
35033501

35043502
/* disable interrupt */
35053503
level = rt_spin_lock_irqsave(&(mq->spinlock));
3504+
3505+
if(mq->entry >= RT_MQ_ENTRY_MAX)
3506+
{
3507+
/* return message to free list */
3508+
msg->next = (struct rt_mq_message *)mq->msg_queue_free;
3509+
mq->msg_queue_free = msg;
3510+
rt_spin_unlock_irqrestore(&(mq->spinlock), level);
3511+
return -RT_EFULL; /* value overflowed */
3512+
}
3513+
35063514
#ifdef RT_USING_MESSAGEQUEUE_PRIORITY
35073515
msg->prio = prio;
35083516
if (mq->msg_queue_head == RT_NULL)
@@ -3544,16 +3552,8 @@ static rt_err_t _rt_mq_send_wait(rt_mq_t mq,
35443552
mq->msg_queue_head = msg;
35453553
#endif
35463554

3547-
if(mq->entry < RT_MQ_ENTRY_MAX)
3548-
{
3549-
/* increase message entry */
3550-
mq->entry ++;
3551-
}
3552-
else
3553-
{
3554-
rt_spin_unlock_irqrestore(&(mq->spinlock), level);
3555-
return -RT_EFULL; /* value overflowed */
3556-
}
3555+
/* increase message entry */
3556+
mq->entry ++;
35573557

35583558
/* resume suspended thread */
35593559
if (!rt_list_isempty(&mq->parent.suspend_thread))
@@ -3694,6 +3694,15 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)
36943694

36953695
level = rt_spin_lock_irqsave(&(mq->spinlock));
36963696

3697+
if(mq->entry >= RT_MQ_ENTRY_MAX)
3698+
{
3699+
/* return message to free list */
3700+
msg->next = (struct rt_mq_message *)mq->msg_queue_free;
3701+
mq->msg_queue_free = msg;
3702+
rt_spin_unlock_irqrestore(&(mq->spinlock), level);
3703+
return -RT_EFULL; /* value overflowed */
3704+
}
3705+
36973706
/* link msg to the beginning of message queue */
36983707
msg->next = (struct rt_mq_message *)mq->msg_queue_head;
36993708
mq->msg_queue_head = msg;
@@ -3702,16 +3711,8 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)
37023711
if (mq->msg_queue_tail == RT_NULL)
37033712
mq->msg_queue_tail = msg;
37043713

3705-
if(mq->entry < RT_MQ_ENTRY_MAX)
3706-
{
3707-
/* increase message entry */
3708-
mq->entry ++;
3709-
}
3710-
else
3711-
{
3712-
rt_spin_unlock_irqrestore(&(mq->spinlock), level);
3713-
return -RT_EFULL; /* value overflowed */
3714-
}
3714+
/* increase message entry */
3715+
mq->entry ++;
37153716

37163717
/* resume suspended thread */
37173718
if (!rt_list_isempty(&mq->parent.suspend_thread))

0 commit comments

Comments
 (0)