|
484 | 484 | LLMNRAnswer_t * pxAnswer; |
485 | 485 | uint8_t * pucNewBuffer = NULL; |
486 | 486 | size_t uxExtraLength; |
| 487 | + size_t uxDataLength = uxBufferLength + |
| 488 | + sizeof( UDPHeader_t ) + |
| 489 | + sizeof( EthernetHeader_t ) + |
| 490 | + uxIPHeaderSizePacket( pxNetworkBuffer ); |
487 | 491 |
|
488 | | - if( xBufferAllocFixedSize == pdFALSE ) |
489 | | - { |
490 | | - size_t uxDataLength = uxBufferLength + |
491 | | - sizeof( UDPHeader_t ) + |
492 | | - sizeof( EthernetHeader_t ) + |
493 | | - uxIPHeaderSizePacket( pxNetworkBuffer ); |
494 | | - |
495 | | - #if ( ipconfigUSE_IPv6 != 0 ) |
496 | | - if( xSet.usType == dnsTYPE_AAAA_HOST ) |
497 | | - { |
498 | | - uxExtraLength = sizeof( LLMNRAnswer_t ) + ipSIZE_OF_IPv6_ADDRESS - sizeof( pxAnswer->ulIPAddress ); |
499 | | - } |
500 | | - else |
501 | | - #endif /* ( ipconfigUSE_IPv6 != 0 ) */ |
502 | | - #if ( ipconfigUSE_IPv4 != 0 ) |
503 | | - { |
504 | | - uxExtraLength = sizeof( LLMNRAnswer_t ); |
505 | | - } |
506 | | - #else /* ( ipconfigUSE_IPv4 != 0 ) */ |
| 492 | + #if ( ipconfigUSE_IPv6 != 0 ) |
| 493 | + if( xSet.usType == dnsTYPE_AAAA_HOST ) |
507 | 494 | { |
508 | | - /* do nothing, coverity happy */ |
| 495 | + uxExtraLength = sizeof( LLMNRAnswer_t ) + ipSIZE_OF_IPv6_ADDRESS - sizeof( pxAnswer->ulIPAddress ); |
509 | 496 | } |
510 | | - #endif /* ( ipconfigUSE_IPv4 != 0 ) */ |
| 497 | + else |
| 498 | + #endif /* ( ipconfigUSE_IPv6 != 0 ) */ |
| 499 | + #if ( ipconfigUSE_IPv4 != 0 ) |
| 500 | + { |
| 501 | + uxExtraLength = sizeof( LLMNRAnswer_t ); |
| 502 | + } |
| 503 | + #else /* ( ipconfigUSE_IPv4 != 0 ) */ |
| 504 | + { |
| 505 | + /* do nothing, coverity happy */ |
| 506 | + } |
| 507 | + #endif /* ( ipconfigUSE_IPv4 != 0 ) */ |
511 | 508 |
|
| 509 | + if( xBufferAllocFixedSize == pdFALSE ) |
| 510 | + { |
512 | 511 | /* Set the size of the outgoing packet. */ |
513 | 512 | pxNetworkBuffer->xDataLength = uxDataLength; |
514 | 513 | pxNewBuffer = pxDuplicateNetworkBufferWithDescriptor( pxNetworkBuffer, |
|
537 | 536 | } |
538 | 537 | else |
539 | 538 | { |
540 | | - pucNewBuffer = &( pxNetworkBuffer->pucEthernetBuffer[ uxUDPOffset ] ); |
| 539 | + /* When xBufferAllocFixedSize is TRUE, check if the buffer size is big enough to |
| 540 | + * store the answer. */ |
| 541 | + if( ( uxDataLength + uxExtraLength ) <= ipconfigNETWORK_MTU + ipSIZE_OF_ETH_HEADER ) |
| 542 | + { |
| 543 | + pucNewBuffer = &( pxNetworkBuffer->pucEthernetBuffer[ uxUDPOffset ] ); |
| 544 | + } |
| 545 | + else |
| 546 | + { |
| 547 | + /* Just to indicate that the message may not be answered. */ |
| 548 | + pxNetworkBuffer = NULL; |
| 549 | + } |
541 | 550 | } |
542 | 551 |
|
543 | 552 | if( ( pxNetworkBuffer != NULL ) ) |
|
1093 | 1102 | /* Define the ASCII value of the capital "A". */ |
1094 | 1103 | const uint8_t ucCharA = ( uint8_t ) 0x41U; |
1095 | 1104 |
|
1096 | | - ucByte = ( uint8_t ) ( ( ( pucSource[ 0 ] - ucCharA ) << 4 ) | |
| 1105 | + ucByte = ( uint8_t ) ( ( ( ( pucSource[ 0 ] - ucCharA ) & 0x0F ) << 4 ) | |
1097 | 1106 | ( pucSource[ 1 ] - ucCharA ) ); |
1098 | 1107 |
|
1099 | 1108 | /* Make sure there are no trailing spaces in the name. */ |
|
1208 | 1217 | { |
1209 | 1218 | /* BufferAllocation_1.c is used, the Network Buffers can contain at least |
1210 | 1219 | * ipconfigNETWORK_MTU + ipSIZE_OF_ETH_HEADER. */ |
1211 | | - configASSERT( uxSizeNeeded < ipconfigNETWORK_MTU + ipSIZE_OF_ETH_HEADER ); |
| 1220 | + if( uxSizeNeeded > ( ipconfigNETWORK_MTU + ipSIZE_OF_ETH_HEADER ) ) |
| 1221 | + { |
| 1222 | + /* The buffer is too small to reply. Drop silently. */ |
| 1223 | + break; |
| 1224 | + } |
1212 | 1225 | } |
1213 | 1226 |
|
1214 | 1227 | pxNetworkBuffer->xDataLength = uxSizeNeeded; |
|
0 commit comments