Skip to content

Commit ee733ba

Browse files
authored
Merge pull request #3975 from mysterywolf/master
[bug fixed] add mb mq value overflow-check code
2 parents 877921f + 98f0cfb commit ee733ba

File tree

2 files changed

+73
-17
lines changed

2 files changed

+73
-17
lines changed

include/rtdef.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
* 2019-05-17 Bernard change version number to v4.0.2
3434
* 2019-12-20 Bernard change version number to v4.0.3
3535
* 2020-08-10 Meco Man add macro for struct rt_device_ops
36+
* 2020-10-23 Meco Man define maximum value of ipc type
3637
*/
3738

3839
#ifndef __RT_DEF_H__
@@ -102,6 +103,13 @@ typedef rt_base_t rt_off_t; /**< Type for offset */
102103
#define RT_UINT32_MAX 0xffffffff /**< Maxium number of UINT32 */
103104
#define RT_TICK_MAX RT_UINT32_MAX /**< Maxium number of tick */
104105

106+
/* maximum value of ipc type */
107+
#define RT_SEM_VALUE_MAX RT_UINT16_MAX /**< Maxium number of semaphore .value */
108+
#define RT_MUTEX_VALUE_MAX RT_UINT16_MAX /**< Maxium number of mutex .value */
109+
#define RT_MUTEX_HOLD_MAX RT_UINT8_MAX /**< Maxium number of mutex .hold */
110+
#define RT_MB_ENTRY_MAX RT_UINT16_MAX /**< Maxium number of mailbox .entry */
111+
#define RT_MQ_ENTRY_MAX RT_UINT16_MAX /**< Maxium number of message queue .entry */
112+
105113
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
106114
#define __CLANG_ARM
107115
#endif

src/ipc.c

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
* 2019-09-16 tyx add send wait support for message queue
3737
* 2020-07-29 Meco Man fix thread->event_set/event_info when received an
3838
* event without pending
39-
* 2020-10-11 Meco Man add semaphore values' overflow-check code
40-
* 2020-10-21 Meco Man add mutex values' overflow-check code
39+
* 2020-10-11 Meco Man add value overflow-check code
4140
*/
4241

4342
#include <rtthread.h>
@@ -466,7 +465,7 @@ rt_err_t rt_sem_release(rt_sem_t sem)
466465
}
467466
else
468467
{
469-
if(sem->value < 65535u)
468+
if(sem->value < RT_SEM_VALUE_MAX)
470469
{
471470
sem->value ++; /* increase value */
472471
}
@@ -697,7 +696,7 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
697696

698697
if (mutex->owner == thread)
699698
{
700-
if(mutex->hold < 255u)
699+
if(mutex->hold < RT_MUTEX_HOLD_MAX)
701700
{
702701
/* it's the same thread */
703702
mutex->hold ++;
@@ -724,7 +723,15 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
724723
/* set mutex owner and original priority */
725724
mutex->owner = thread;
726725
mutex->original_priority = thread->current_priority;
727-
mutex->hold ++;
726+
if(mutex->hold < RT_MUTEX_HOLD_MAX)
727+
{
728+
mutex->hold ++;
729+
}
730+
else
731+
{
732+
rt_hw_interrupt_enable(temp); /* enable interrupt */
733+
return -RT_EFULL; /* value overflowed */
734+
}
728735
}
729736
else
730737
{
@@ -881,7 +888,15 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
881888
/* set new owner and priority */
882889
mutex->owner = thread;
883890
mutex->original_priority = thread->current_priority;
884-
mutex->hold ++;
891+
if(mutex->hold < RT_MUTEX_HOLD_MAX)
892+
{
893+
mutex->hold ++;
894+
}
895+
else
896+
{
897+
rt_hw_interrupt_enable(temp); /* enable interrupt */
898+
return -RT_EFULL; /* value overflowed */
899+
}
885900

886901
/* resume thread */
887902
rt_ipc_list_resume(&(mutex->parent.suspend_thread));
@@ -890,9 +905,17 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
890905
}
891906
else
892907
{
893-
/* increase value */
894-
mutex->value ++;
895-
908+
if(mutex->value < RT_MUTEX_VALUE_MAX)
909+
{
910+
/* increase value */
911+
mutex->value ++;
912+
}
913+
else
914+
{
915+
rt_hw_interrupt_enable(temp); /* enable interrupt */
916+
return -RT_EFULL; /* value overflowed */
917+
}
918+
896919
/* clear owner */
897920
mutex->owner = RT_NULL;
898921
mutex->original_priority = 0xff;
@@ -1583,9 +1606,18 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
15831606
++ mb->in_offset;
15841607
if (mb->in_offset >= mb->size)
15851608
mb->in_offset = 0;
1586-
/* increase message entry */
1587-
mb->entry ++;
1588-
1609+
1610+
if(mb->entry < RT_MB_ENTRY_MAX)
1611+
{
1612+
/* increase message entry */
1613+
mb->entry ++;
1614+
}
1615+
else
1616+
{
1617+
rt_hw_interrupt_enable(temp); /* enable interrupt */
1618+
return -RT_EFULL; /* value overflowed */
1619+
}
1620+
15891621
/* resume suspended thread */
15901622
if (!rt_list_isempty(&mb->parent.suspend_thread))
15911623
{
@@ -2147,8 +2179,16 @@ rt_err_t rt_mq_send_wait(rt_mq_t mq,
21472179
if (mq->msg_queue_head == RT_NULL)
21482180
mq->msg_queue_head = msg;
21492181

2150-
/* increase message entry */
2151-
mq->entry ++;
2182+
if(mq->entry < RT_MQ_ENTRY_MAX)
2183+
{
2184+
/* increase message entry */
2185+
mq->entry ++;
2186+
}
2187+
else
2188+
{
2189+
rt_hw_interrupt_enable(temp); /* enable interrupt */
2190+
return -RT_EFULL; /* value overflowed */
2191+
}
21522192

21532193
/* resume suspended thread */
21542194
if (!rt_list_isempty(&mq->parent.suspend_thread))
@@ -2247,9 +2287,17 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)
22472287
if (mq->msg_queue_tail == RT_NULL)
22482288
mq->msg_queue_tail = msg;
22492289

2250-
/* increase message entry */
2251-
mq->entry ++;
2252-
2290+
if(mq->entry < RT_MQ_ENTRY_MAX)
2291+
{
2292+
/* increase message entry */
2293+
mq->entry ++;
2294+
}
2295+
else
2296+
{
2297+
rt_hw_interrupt_enable(temp); /* enable interrupt */
2298+
return -RT_EFULL; /* value overflowed */
2299+
}
2300+
22532301
/* resume suspended thread */
22542302
if (!rt_list_isempty(&mq->parent.suspend_thread))
22552303
{

0 commit comments

Comments
 (0)