Skip to content

Commit 8670eb1

Browse files
committed
fix: 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. Signed-off-by: Srikanth Patchava <spatchava@meta.com> Signed-off-by: Srikanth Patchava <srikanth.patchava@outlook.com>
1 parent ddd2297 commit 8670eb1

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
@@ -2664,23 +2664,21 @@ static rt_err_t _rt_mb_send_wait(rt_mailbox_t mb,
26642664
}
26652665
}
26662666

2667+
if(mb->entry >= RT_MB_ENTRY_MAX)
2668+
{
2669+
rt_spin_unlock_irqrestore(&(mb->spinlock), level);
2670+
return -RT_EFULL; /* value overflowed */
2671+
}
2672+
26672673
/* set ptr */
26682674
mb->msg_pool[mb->in_offset] = value;
26692675
/* increase input offset */
26702676
++ mb->in_offset;
26712677
if (mb->in_offset >= mb->size)
26722678
mb->in_offset = 0;
26732679

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

26852683
/* resume suspended thread */
26862684
if (!rt_list_isempty(&mb->parent.suspend_thread))
@@ -3506,6 +3504,16 @@ static rt_err_t _rt_mq_send_wait(rt_mq_t mq,
35063504

35073505
/* disable interrupt */
35083506
level = rt_spin_lock_irqsave(&(mq->spinlock));
3507+
3508+
if(mq->entry >= RT_MQ_ENTRY_MAX)
3509+
{
3510+
/* return message to free list */
3511+
msg->next = (struct rt_mq_message *)mq->msg_queue_free;
3512+
mq->msg_queue_free = msg;
3513+
rt_spin_unlock_irqrestore(&(mq->spinlock), level);
3514+
return -RT_EFULL; /* value overflowed */
3515+
}
3516+
35093517
#ifdef RT_USING_MESSAGEQUEUE_PRIORITY
35103518
msg->prio = prio;
35113519
if (mq->msg_queue_head == RT_NULL)
@@ -3547,16 +3555,8 @@ static rt_err_t _rt_mq_send_wait(rt_mq_t mq,
35473555
mq->msg_queue_head = msg;
35483556
#endif
35493557

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

35613561
/* resume suspended thread */
35623562
if (!rt_list_isempty(&mq->parent.suspend_thread))
@@ -3697,6 +3697,15 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)
36973697

36983698
level = rt_spin_lock_irqsave(&(mq->spinlock));
36993699

3700+
if(mq->entry >= RT_MQ_ENTRY_MAX)
3701+
{
3702+
/* return message to free list */
3703+
msg->next = (struct rt_mq_message *)mq->msg_queue_free;
3704+
mq->msg_queue_free = msg;
3705+
rt_spin_unlock_irqrestore(&(mq->spinlock), level);
3706+
return -RT_EFULL; /* value overflowed */
3707+
}
3708+
37003709
/* link msg to the beginning of message queue */
37013710
msg->next = (struct rt_mq_message *)mq->msg_queue_head;
37023711
mq->msg_queue_head = msg;
@@ -3705,16 +3714,8 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)
37053714
if (mq->msg_queue_tail == RT_NULL)
37063715
mq->msg_queue_tail = msg;
37073716

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

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

0 commit comments

Comments
 (0)