51
51
#endif
52
52
53
53
/* A few bytes might be lost to byte aligning the heap start address. */
54
- #define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )
54
+ #define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )
55
+
56
+ /* Max value that fits in a size_t type. */
57
+ #define heapSIZE_MAX ( ~( ( size_t ) 0 ) )
58
+
59
+ /* Check if adding a and b will result in overflow. */
60
+ #define heapADD_WILL_OVERFLOW ( a , b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) )
61
+
62
+ /*-----------------------------------------------------------*/
55
63
56
64
/* Allocate the memory for the heap. */
57
65
#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )
@@ -76,12 +84,16 @@ void * pvPortMalloc( size_t xWantedSize )
76
84
/* Ensure that blocks are always aligned. */
77
85
#if ( portBYTE_ALIGNMENT != 1 )
78
86
{
79
- if ( xWantedSize & portBYTE_ALIGNMENT_MASK )
87
+ size_t xAdditionalRequiredSize ;
88
+
89
+ if ( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
80
90
{
81
- /* Byte alignment required. Check for overflow. */
82
- if ( ( xWantedSize + ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ) ) > xWantedSize )
91
+ /* Byte alignment required. */
92
+ xAdditionalRequiredSize = portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK );
93
+
94
+ if ( heapADD_WILL_OVERFLOW ( xWantedSize , xAdditionalRequiredSize ) == 0 )
83
95
{
84
- xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ) ;
96
+ xWantedSize += xAdditionalRequiredSize ;
85
97
}
86
98
else
87
99
{
@@ -96,13 +108,14 @@ void * pvPortMalloc( size_t xWantedSize )
96
108
if ( pucAlignedHeap == NULL )
97
109
{
98
110
/* Ensure the heap starts on a correctly aligned boundary. */
99
- pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ucHeap [ portBYTE_ALIGNMENT - 1 ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
111
+ pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ( ucHeap [ portBYTE_ALIGNMENT - 1 ] ) ) &
112
+ ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
100
113
}
101
114
102
- /* Check there is enough room left for the allocation and . */
103
- if ( ( xWantedSize > 0 ) && /* valid size */
104
- ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) &&
105
- ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) ) /* Check for overflow. */
115
+ /* Check there is enough room left for the allocation. */
116
+ if ( ( xWantedSize > 0 ) &&
117
+ ( heapADD_WILL_OVERFLOW ( xNextFreeByte , xWantedSize ) == 0 ) &&
118
+ ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) )
106
119
{
107
120
/* Return the next free byte then increment the index past this
108
121
* block. */
0 commit comments