|
147 | 147 | MACAddress_t * const pxMACAddress, |
148 | 148 | NetworkEndPoint_t ** ppxEndPoint ) |
149 | 149 | { |
150 | | - eARPLookupResult_t eReturn; |
| 150 | + eARPLookupResult_t eReturn = eARPCacheMiss; |
151 | 151 |
|
152 | 152 | /* Mostly used multi-cast address is ff02::. */ |
153 | 153 | if( xIsIPv6AllowedMulticast( pxAddressToLookup ) != pdFALSE ) |
|
157 | 157 | if( ppxEndPoint != NULL ) |
158 | 158 | { |
159 | 159 | *ppxEndPoint = pxFindLocalEndpoint(); |
160 | | - } |
161 | 160 |
|
162 | | - eReturn = eARPCacheHit; |
| 161 | + if (*ppxEndPoint != NULL) |
| 162 | + { |
| 163 | + eReturn = eARPCacheHit; |
| 164 | + } |
| 165 | + else |
| 166 | + { |
| 167 | + /* No link-local endpoint configured, eARPCacheHit */ |
| 168 | + } |
| 169 | + } |
163 | 170 | } |
164 | 171 | else |
165 | 172 | { |
166 | | - /* Not a multicast IP address. */ |
167 | | - eReturn = eARPCacheMiss; |
| 173 | + /* Not a multicast IP address, eARPCacheHit */ |
168 | 174 | } |
169 | 175 |
|
170 | 176 | return eReturn; |
|
955 | 961 | */ |
956 | 962 | eFrameProcessingResult_t prvProcessICMPMessage_IPv6( NetworkBufferDescriptor_t * const pxNetworkBuffer ) |
957 | 963 | { |
| 964 | + /* |
| 965 | + ICMPv6 messages have the following general format: |
| 966 | +
|
| 967 | + 0 1 2 3 |
| 968 | + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| 969 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 970 | + | Type | Code | Checksum | |
| 971 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 972 | + | | |
| 973 | + + Message Body + |
| 974 | + | | |
| 975 | +
|
| 976 | + The packet should contain atleast 4 bytes of general fields |
| 977 | +
|
| 978 | + */ |
| 979 | + if( pxNetworkBuffer->xDataLength >= ( size_t ) ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + ipICMPv6_GENERAL_FIELD_SIZE ) ) |
| 980 | + { |
958 | 981 | /* MISRA Ref 11.3.1 [Misaligned access] */ |
959 | 982 | /* More details at: https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/blob/main/MISRA.md#rule-113 */ |
960 | 983 | /* coverity[misra_c_2012_rule_11_3_violation] */ |
|
1029 | 1052 |
|
1030 | 1053 | /* Find the total length of the IP packet. */ |
1031 | 1054 | uxDataLength = ipNUMERIC_CAST( size_t, FreeRTOS_ntohs( pxICMPPacket->xIPHeader.usPayloadLength ) ); |
| 1055 | + |
| 1056 | + uxNeededSize = ( size_t ) ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxDataLength ); |
| 1057 | + if( uxNeededSize > pxNetworkBuffer->xDataLength ) |
| 1058 | + { |
| 1059 | + FreeRTOS_printf( ( "Too small\n" ) ); |
| 1060 | + break; |
| 1061 | + } |
| 1062 | + |
1032 | 1063 | uxDataLength = uxDataLength - sizeof( *pxICMPEchoHeader ); |
1033 | 1064 |
|
1034 | 1065 | /* Find the first byte of the data within the ICMP packet. */ |
|
1105 | 1136 | break; |
1106 | 1137 |
|
1107 | 1138 | case ipICMP_NEIGHBOR_ADVERTISEMENT_IPv6: |
| 1139 | + { |
| 1140 | + size_t uxICMPSize; |
| 1141 | + uxICMPSize = sizeof( ICMPHeader_IPv6_t ); |
| 1142 | + uxNeededSize = ( size_t ) ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv6_HEADER + uxICMPSize ); |
| 1143 | + |
| 1144 | + if( uxNeededSize > pxNetworkBuffer->xDataLength ) |
| 1145 | + { |
| 1146 | + FreeRTOS_printf( ( "Too small\n" ) ); |
| 1147 | + break; |
| 1148 | + } |
1108 | 1149 | /* MISRA Ref 11.3.1 [Misaligned access] */ |
1109 | 1150 | /* More details at: https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/blob/main/MISRA.md#rule-113 */ |
1110 | 1151 | /* coverity[misra_c_2012_rule_11_3_violation] */ |
|
1126 | 1167 | { |
1127 | 1168 | prvCheckWaitingBuffer( &( pxICMPHeader_IPv6->xIPv6Address ) ); |
1128 | 1169 | } |
1129 | | - |
| 1170 | + } |
1130 | 1171 | break; |
1131 | 1172 |
|
1132 | 1173 | case ipICMP_ROUTER_SOLICITATION_IPv6: |
1133 | 1174 | break; |
1134 | 1175 |
|
1135 | 1176 | #if ( ipconfigUSE_RA != 0 ) |
1136 | 1177 | case ipICMP_ROUTER_ADVERTISEMENT_IPv6: |
| 1178 | + /* Size check is done inside vReceiveRA */ |
1137 | 1179 | vReceiveRA( pxNetworkBuffer ); |
1138 | 1180 | break; |
1139 | 1181 | #endif /* ( ipconfigUSE_RA != 0 ) */ |
|
1143 | 1185 | break; |
1144 | 1186 | } /* switch( pxICMPHeader_IPv6->ucTypeOfMessage ) */ |
1145 | 1187 | } /* if( pxEndPoint->bits.bIPv6 != pdFALSE_UNSIGNED ) */ |
1146 | | - |
| 1188 | + } |
| 1189 | + else |
| 1190 | + { |
| 1191 | + /* Malformed ICMPv6 packet, release the network buffer (performed |
| 1192 | + in prvProcessEthernetPacket)*/ |
| 1193 | + } |
1147 | 1194 | return eReleaseBuffer; |
1148 | 1195 | } |
1149 | 1196 | /*-----------------------------------------------------------*/ |
|
0 commit comments