Skip to content

Commit b3f586f

Browse files
Fix possible network buffer leak DHCP v4 and v6 state machines (#1231)
* Fix possible network buffer leak in DHCP v4 and v6 * DHCP v4 UT full code cov * Full code coverage DHCP v6 * Fix naming * Add UT coverage for vReleaseSinglePacketFromUDPSocket * Add UT coverage for vReleaseSinglePacketFromUDPSocket * Fix formatting * Fix compiler warning * Fix compiler warning * Fix DHCP v6 CBMC * Fix unit tests
1 parent c78910a commit b3f586f

File tree

15 files changed

+321
-15
lines changed

15 files changed

+321
-15
lines changed

source/FreeRTOS_DHCP.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,13 @@
224224
{
225225
FreeRTOS_printf( ( "vDHCPProcess: FreeRTOS_recvfrom returns %d\n", ( int ) lBytes ) );
226226
}
227+
else if( lBytes >= 0 )
228+
{
229+
vReleaseSinglePacketFromUDPSocket( EP_DHCPData.xDHCPSocket );
230+
}
231+
else
232+
{
233+
}
227234

228235
break;
229236
}

source/FreeRTOS_DHCPv6.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,13 @@ void vDHCPv6Process( BaseType_t xReset,
436436
{
437437
FreeRTOS_printf( ( "vDHCPProcess: FreeRTOS_recvfrom returns %d\n", ( int ) lBytes ) );
438438
}
439+
else if( lBytes == 0 )
440+
{
441+
vReleaseSinglePacketFromUDPSocket( EP_DHCPData.xDHCPSocket );
442+
}
443+
else
444+
{
445+
}
439446

440447
break;
441448
}
@@ -450,6 +457,8 @@ void vDHCPv6Process( BaseType_t xReset,
450457
{
451458
xDoProcess = xDHCPv6Process_PassReplyToEndPoint( pxEndPoint );
452459
}
460+
461+
FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayload );
453462
}
454463
}
455464

source/FreeRTOS_IP_Utils.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,6 +1825,27 @@ uint32_t FreeRTOS_round_down( uint32_t a,
18251825
}
18261826
/*-----------------------------------------------------------*/
18271827

1828+
/**
1829+
* @brief Release single UDP packet from a given socket
1830+
* @param[in] xSocket UDP Socket from which the packet should be released.
1831+
*/
1832+
void vReleaseSinglePacketFromUDPSocket( const ConstSocket_t xSocket )
1833+
{
1834+
uint8_t * pucUDPPayload = NULL;
1835+
int32_t lBytes;
1836+
1837+
/* Passing the address of a pointer (pucUDPPayload) because FREERTOS_ZERO_COPY is used. */
1838+
lBytes = FreeRTOS_recvfrom( xSocket, &pucUDPPayload, 0U, FREERTOS_ZERO_COPY, NULL, NULL );
1839+
1840+
( void ) lBytes;
1841+
1842+
if( pucUDPPayload != NULL )
1843+
{
1844+
FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayload );
1845+
}
1846+
}
1847+
/*-----------------------------------------------------------*/
1848+
18281849
/**
18291850
* @brief Convert character array (of size 4) to equivalent 32-bit value.
18301851
* @param[in] pucPtr The character array.

source/include/FreeRTOS_IP_Utils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ void vPreCheckConfigs( void );
109109
*/
110110
void prvProcessNetworkDownEvent( struct xNetworkInterface * pxInterface );
111111

112+
/**
113+
* @brief Release single UDP packet from a given socket
114+
*/
115+
void vReleaseSinglePacketFromUDPSocket( const ConstSocket_t xSocket );
112116

113117
/* *INDENT-OFF* */
114118
#ifdef __cplusplus

test/cbmc/proofs/DHCPv6/DHCPv6Process/DHCPv6Process_harness.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,16 @@ int32_t FreeRTOS_recvfrom( Socket_t xSocket,
153153
return retVal;
154154
}
155155

156+
/* For the purpose of this proof we stub the
157+
* implementation of FreeRTOS_ReleaseUDPPayloadBuffer here, but make sure that
158+
* the pvBuffer is not NULL, its not verified here if the pointer is a valid
159+
* payload buffer as its proved in other proofs */
160+
void FreeRTOS_ReleaseUDPPayloadBuffer( void * pvBuffer )
161+
{
162+
__CPROVER_assert( pvBuffer != NULL,
163+
"FreeRTOS precondition: pvBuffer != NULL" );
164+
}
165+
156166
void harness()
157167
{
158168
BaseType_t xReset;

test/cbmc/proofs/DHCPv6/DHCPv6Process/Makefile.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"CBMCFLAGS":
66
[
77
"--unwind {LOOP_UNWIND_COUNT}",
8+
"--unwindset memcmp.0:17",
89
"--nondet-static --flush"
910
],
1011
"OPT":

test/unit-test/FreeRTOS_DHCP/FreeRTOS_DHCP_utest.c

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "mock_NetworkBufferManagement.h"
1717
#include "mock_FreeRTOS_DHCP_mock.h"
1818
#include "mock_FreeRTOS_IP_Common.h"
19+
#include "mock_FreeRTOS_IP_Utils.h"
1920

2021
#include "FreeRTOS_DHCP.h"
2122

@@ -343,6 +344,7 @@ void test_vDHCPProcess_ResetAndIncorrectStateWithSocketAlreadyCreated( void )
343344
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
344345
/* Ignore the buffer argument though. */
345346
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
347+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
346348
/* Make random number generation pass. */
347349
xApplicationGetRandomNumber_ExpectAndReturn( &( pxEndPoint->xDHCPData.ulTransactionId ), pdTRUE );
348350
/* See if the timer is reloaded. */
@@ -365,6 +367,76 @@ void test_vDHCPProcess_ResetAndIncorrectStateWithSocketAlreadyCreated( void )
365367
}
366368
}
367369

370+
/* Verify the control flow when FreeRTOS_recvfrom with DHCP socket returns timeout. */
371+
void test_vDHCPProcess_RecvFromReturnsTimeout( void )
372+
{
373+
struct xSOCKET xTestSocket;
374+
NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
375+
376+
/* This should remain unchanged. */
377+
xDHCPv4Socket = &xTestSocket;
378+
xDHCPSocketUserCount = 1;
379+
pxEndPoint->xDHCPData.xDHCPSocket = &xTestSocket;
380+
/* Put any state. */
381+
pxEndPoint->xDHCPData.eDHCPState = eSendDHCPRequest;
382+
pxEndPoint->xDHCPData.eExpectedState = eSendDHCPRequest;
383+
/* This should be reset to 0. */
384+
pxEndPoint->xDHCPData.xUseBroadcast = 1;
385+
/* This should be reset as well */
386+
pxEndPoint->xDHCPData.ulOfferedIPAddress = 0xAAAAAAAA;
387+
/* And this too. */
388+
pxEndPoint->xDHCPData.ulDHCPServerAddress = 0xABABABAB;
389+
/* And this should be updated. */
390+
pxEndPoint->xDHCPData.xDHCPTxPeriod = 0;
391+
392+
/* Expect these arguments. */
393+
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, -pdFREERTOS_ERRNO_EAGAIN );
394+
/* Ignore the buffer argument though. */
395+
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
396+
397+
/* Make random number generation pass. */
398+
xApplicationGetRandomNumber_ExpectAndReturn( &( pxEndPoint->xDHCPData.ulTransactionId ), pdTRUE );
399+
/* See if the timer is reloaded. */
400+
vDHCP_RATimerReload_Expect( &xEndPoint, dhcpINITIAL_TIMER_PERIOD );
401+
402+
vDHCPProcess( pdTRUE, pxEndPoint );
403+
}
404+
405+
/* Verify the control flow when FreeRTOS_recvfrom with DHCP socket returns IO error/any other error. */
406+
void test_vDHCPProcess_RecvFromReturnsIOError( void )
407+
{
408+
struct xSOCKET xTestSocket;
409+
NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
410+
411+
/* This should remain unchanged. */
412+
xDHCPv4Socket = &xTestSocket;
413+
xDHCPSocketUserCount = 1;
414+
pxEndPoint->xDHCPData.xDHCPSocket = &xTestSocket;
415+
/* Put any state. */
416+
pxEndPoint->xDHCPData.eDHCPState = eSendDHCPRequest;
417+
pxEndPoint->xDHCPData.eExpectedState = eSendDHCPRequest;
418+
/* This should be reset to 0. */
419+
pxEndPoint->xDHCPData.xUseBroadcast = 1;
420+
/* This should be reset as well */
421+
pxEndPoint->xDHCPData.ulOfferedIPAddress = 0xAAAAAAAA;
422+
/* And this too. */
423+
pxEndPoint->xDHCPData.ulDHCPServerAddress = 0xABABABAB;
424+
/* And this should be updated. */
425+
pxEndPoint->xDHCPData.xDHCPTxPeriod = 0;
426+
427+
/* Expect these arguments. */
428+
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, -pdFREERTOS_ERRNO_EIO );
429+
/* Ignore the buffer argument though. */
430+
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
431+
432+
/* Make random number generation pass. */
433+
xApplicationGetRandomNumber_ExpectAndReturn( &( pxEndPoint->xDHCPData.ulTransactionId ), pdTRUE );
434+
/* See if the timer is reloaded. */
435+
vDHCP_RATimerReload_Expect( &xEndPoint, dhcpINITIAL_TIMER_PERIOD );
436+
437+
vDHCPProcess( pdTRUE, pxEndPoint );
438+
}
439+
368440
void test_vDHCPProcess_CorrectStateDHCPHookFailsDHCPSocketNULL( void )
369441
{
370442
NetworkEndPoint_t xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
@@ -422,6 +494,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookFailsDHCPSocketNonNULL( void )
422494
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
423495
/* Ignore the buffer argument though. */
424496
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
497+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
425498
/* Make sure that the user indicates anything else than the desired options. */
426499
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
427500
pxStubExpectedEndPoint = pxEndPoint;
@@ -469,6 +542,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookDefaultReturn( void )
469542
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
470543
/* Ignore the buffer argument though. */
471544
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
545+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
472546
/* Make sure that the user indicates anything else than the desired options. */
473547
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
474548
pxStubExpectedEndPoint = pxEndPoint;
@@ -513,6 +587,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnDHCPSocketNotNULLButGNW
513587
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
514588
/* Ignore the buffer argument though. */
515589
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
590+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
516591
/* Make sure that the user indicates anything else than the desired options. */
517592
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
518593
pxStubExpectedEndPoint = pxEndPoint;
@@ -551,6 +626,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnDHCPSocketNotNULLButHos
551626
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
552627
/* Ignore the buffer argument though. */
553628
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
629+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
554630
/* Make sure that the user indicates anything else than the desired options. */
555631
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
556632
pxStubExpectedEndPoint = pxEndPoint;
@@ -623,6 +699,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendFailsNoBroadcast( v
623699
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
624700
/* Ignore the buffer argument though. */
625701
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
702+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
626703
/* Make sure that the user indicates anything else than the desired options. */
627704
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
628705
pxStubExpectedEndPoint = pxEndPoint;
@@ -671,6 +748,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendFailsNoBroadcast_NU
671748
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
672749
/* Ignore the buffer argument though. */
673750
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
751+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
674752
/* Make sure that the user indicates anything else than the desired options. */
675753
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
676754
pxStubExpectedEndPoint = pxEndPoint;
@@ -720,6 +798,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendFailsUseBroadCast(
720798
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
721799
/* Ignore the buffer argument though. */
722800
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
801+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
723802
/* Make sure that the user indicates anything else than the desired options. */
724803
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
725804
pxStubExpectedEndPoint = pxEndPoint;
@@ -770,6 +849,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendSucceedsUseBroadCas
770849
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
771850
/* Ignore the buffer argument though. */
772851
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
852+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
773853
/* Make sure that the user indicates anything else than the desired options. */
774854
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
775855
pxStubExpectedEndPoint = pxEndPoint;
@@ -821,6 +901,7 @@ void test_vDHCPProcess_CorrectStateDHCPHookContinueReturnSendSucceedsUseBroadCas
821901
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
822902
/* Ignore the buffer argument though. */
823903
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
904+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
824905
/* Make sure that the user indicates anything else than the desired options. */
825906
eStubExpectedDHCPPhase = eDHCPPhasePreDiscover;
826907
pxStubExpectedEndPoint = pxEndPoint;
@@ -868,6 +949,7 @@ void test_vDHCPProcess_eSendDHCPRequestCorrectStateGNWFails( void )
868949
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
869950
/* Ignore the buffer argument though. */
870951
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
952+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
871953
/* Get the hostname. */
872954
pcApplicationHostnameHook_ExpectAndReturn( pcHostName );
873955
/* Return NULL network buffer. */
@@ -900,6 +982,7 @@ void test_vDHCPProcess_eSendDHCPRequestCorrectStateGNWSucceedsSendFails( void )
900982
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
901983
/* Ignore the buffer argument though. */
902984
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
985+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
903986
/* Get the hostname. */
904987
pcApplicationHostnameHook_ExpectAndReturn( pcHostName );
905988
/* Returning a proper network buffer. */
@@ -938,6 +1021,7 @@ void test_vDHCPProcess_eSendDHCPRequestCorrectStateGNWSucceedsSendSucceeds( void
9381021
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
9391022
/* Ignore the buffer argument though. */
9401023
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
1024+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
9411025
/* Get the hostname. */
9421026
pcApplicationHostnameHook_ExpectAndReturn( pcHostName );
9431027
/* Returning a proper network buffer. */
@@ -980,6 +1064,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsNoTimeout( void )
9801064
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
9811065
/* Ignore the buffer argument though. */
9821066
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
1067+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
9831068

9841069
/* Make sure that there is no timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */
9851070
/* Return a value which makes the difference just equal to the period. */
@@ -1016,6 +1101,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutGiveUp( void ) /* prvClo
10161101
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
10171102
/* Ignore the buffer argument though. */
10181103
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
1104+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
10191105

10201106
/* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */
10211107
/* Return a value which makes the difference greater than the period. */
@@ -1068,6 +1154,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutDontGiveUpRNGFail( void
10681154
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
10691155
/* Ignore the buffer argument though. */
10701156
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
1157+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
10711158

10721159
/* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */
10731160
/* Return a value which makes the difference greater than the period. */
@@ -1111,6 +1198,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutDontGiveUpRNGPassUseBroa
11111198
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
11121199
/* Ignore the buffer argument though. */
11131200
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
1201+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
11141202

11151203
/* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */
11161204
/* Return a value which makes the difference greater than the period. */
@@ -1164,6 +1252,7 @@ void test_vDHCPProcess_eWaitingOfferRecvfromFailsTimeoutDontGiveUpRNGPassNoBroad
11641252
FreeRTOS_recvfrom_ExpectAndReturn( xDHCPv4Socket, NULL, 0UL, FREERTOS_ZERO_COPY + FREERTOS_MSG_PEEK, NULL, NULL, 0 );
11651253
/* Ignore the buffer argument though. */
11661254
FreeRTOS_recvfrom_IgnoreArg_pvBuffer();
1255+
vReleaseSinglePacketFromUDPSocket_Expect( xDHCPv4Socket );
11671256

11681257
/* Make sure that there is timeout. The expression is: xTaskGetTickCount() - pxEndPoint->xDHCPData.xDHCPTxTime ) > pxEndPoint->xDHCPData.xDHCPTxPeriod */
11691258
/* Return a value which makes the difference greater than the period. */
@@ -1238,7 +1327,7 @@ void test_vDHCPProcess_eLeasedAddress_CorrectState_ValidBytesInMessage( void )
12381327
/**
12391328
*@brief This test function ensures that when the DHCP states are mismatching after
12401329
* initial parsing of response from DHCP server, if a new response from a different DHCP
1241-
* server will cause a infinite loop inside the vDHCPProcess.
1330+
* server will not cause a infinite loop inside the vDHCPProcess.
12421331
*/
12431332
void test_vDHCPProcess_eLeasedAddress_InCorrectState_Loop( void )
12441333
{
@@ -1272,6 +1361,7 @@ void test_vDHCPProcess_eLeasedAddress_InCorrectState_Loop( void )
12721361
FreeRTOS_IsEndPointUp_IgnoreAndReturn( pdFALSE );
12731362

12741363
FreeRTOS_ReleaseUDPPayloadBuffer_Ignore();
1364+
vReleaseSinglePacketFromUDPSocket_Ignore();
12751365

12761366
vDHCPProcess( pdFALSE, pxEndPoint );
12771367

test/unit-test/FreeRTOS_DHCP/ut.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ list(APPEND mock_list
1717
"${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_Routing.h"
1818
"${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Private.h"
1919
"${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Common.h"
20+
"${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Utils.h"
2021
"${CMAKE_BINARY_DIR}/Annexed_TCP/FreeRTOS_IP_Timers.h"
2122
"${CMAKE_BINARY_DIR}/Annexed_TCP/NetworkBufferManagement.h"
2223
"${MODULE_ROOT_DIR}/test/unit-test/${project_name}/FreeRTOS_DHCP_mock.h"

0 commit comments

Comments
 (0)