2222uint32_t FreeRTOS_dnslookup ( const char * pcHostName );
2323Socket_t DNS_CreateSocket ( TickType_t uxReadTimeout_ticks );
2424void DNS_CloseSocket ( Socket_t xDNSSocket );
25- void DNS_ReadReply ( Socket_t xDNSSocket ,
25+ BaseType_t DNS_ReadReply ( ConstSocket_t xDNSSocket ,
2626 struct freertos_sockaddr * xAddress ,
2727 struct xDNSBuffer * pxDNSBuf );
2828uint32_t DNS_SendRequest ( Socket_t xDNSSocket ,
2929 struct freertos_sockaddr * xAddress ,
3030 struct xDNSBuffer * pxDNSBuf );
3131uint32_t DNS_ParseDNSReply ( uint8_t * pucUDPPayloadBuffer ,
32- size_t xBufferLength ,
33- BaseType_t xExpected );
32+ size_t uxBufferLength ,
33+ struct freertos_addrinfo * * ppxAddressInfo ,
34+ BaseType_t xExpected ,
35+ uint16_t usPort );
3436
3537/****************************************************************
3638* We abstract:
@@ -61,8 +63,10 @@ uint32_t DNS_ParseDNSReply( uint8_t * pucUDPPayloadBuffer,
6163****************************************************************/
6264
6365uint32_t DNS_ParseDNSReply ( uint8_t * pucUDPPayloadBuffer ,
64- size_t xBufferLength ,
65- BaseType_t xExpected )
66+ size_t uxBufferLength ,
67+ struct freertos_addrinfo * * ppxAddressInfo ,
68+ BaseType_t xExpected ,
69+ uint16_t usPort )
6670{
6771 uint32_t size ;
6872
@@ -94,32 +98,39 @@ uint32_t DNS_SendRequest( Socket_t xDNSSocket,
9498* We stub out this function which returned a dns_buffer filled with random data
9599*
96100****************************************************************/
97- void DNS_ReadReply ( Socket_t xDNSSocket ,
101+ BaseType_t DNS_ReadReply ( ConstSocket_t xDNSSocket ,
98102 struct freertos_sockaddr * xAddress ,
99103 struct xDNSBuffer * pxDNSBuf )
100104{
105+ BaseType_t ret ;
101106 int len ;
102107
103- pxDNSBuf -> pucPayloadBuffer = safeMalloc ( len );
108+ __CPROVER_assume ( ( len > sizeof ( DNSMessage_t ) ) && ( len < CBMC_MAX_OBJECT_SIZE ) );
109+
110+ pxDNSBuf -> pucPayloadBuffer = malloc ( len );
104111
105112 pxDNSBuf -> uxPayloadLength = len ;
106113
107- __CPROVER_assume ( len < CBMC_MAX_OBJECT_SIZE );
108114 __CPROVER_assume ( pxDNSBuf -> pucPayloadBuffer != NULL );
109115
110- __CPROVER_havoc_slice ( pxDNSBuf -> pucPayloadBuffer , pxDNSBuf -> uxPayloadSize );
116+ __CPROVER_havoc_slice ( pxDNSBuf -> pucPayloadBuffer , pxDNSBuf -> uxPayloadLength );
117+
118+ return ret ;
111119}
112120
113121
114122void DNS_CloseSocket ( Socket_t xDNSSocket )
115123{
124+ __CPROVER_assert ( xDNSSocket != NULL , "The xDNSSocket cannot be NULL." );
125+ free ( xDNSSocket );
116126}
117127
118128Socket_t DNS_CreateSocket ( TickType_t uxReadTimeout_ticks )
119129{
120- Socket_t sock ;
121130
131+ Socket_t sock = malloc ( sizeof (struct xSOCKET ) );
122132 return sock ;
133+
123134}
124135
125136uint32_t FreeRTOS_dnslookup ( const char * pcHostName )
@@ -132,6 +143,16 @@ uint32_t FreeRTOS_dnslookup( const char * pcHostName )
132143 return ret ;
133144}
134145
146+ BaseType_t NetworkInterfaceOutputFunction_Stub ( struct xNetworkInterface * pxDescriptor ,
147+ NetworkBufferDescriptor_t * const pxNetworkBuffer ,
148+ BaseType_t xReleaseAfterSend )
149+ {
150+ __CPROVER_assert ( pxDescriptor != NULL , "The network interface cannot be NULL." );
151+ __CPROVER_assert ( pxNetworkBuffer != NULL , "The network buffer descriptor cannot be NULL." );
152+ __CPROVER_assert ( pxNetworkBuffer -> pucEthernetBuffer != NULL , "The ethernet buffer cannot be NULL." );
153+ BaseType_t ret ;
154+ return ret ;
155+ }
135156
136157/****************************************************************
137158* Abstract prvCreateDNSMessage
@@ -144,14 +165,40 @@ uint32_t FreeRTOS_dnslookup( const char * pcHostName )
144165
145166size_t prvCreateDNSMessage ( uint8_t * pucUDPPayloadBuffer ,
146167 const char * pcHostName ,
147- TickType_t uxIdentifier )
168+ TickType_t uxIdentifier ,
169+ UBaseType_t uxHostType )
148170{
149171 __CPROVER_havoc_object ( pucUDPPayloadBuffer );
150172 size_t size ;
151173
152174 return size ;
153175}
154176
177+ /*We assume that the pxGetNetworkBufferWithDescriptor function is implemented correctly and returns a valid data structure. */
178+ /*This is the mock to mimic the correct expected behavior. If this allocation fails, this might invalidate the proof. */
179+ NetworkBufferDescriptor_t * pxGetNetworkBufferWithDescriptor ( size_t xRequestedSizeBytes ,
180+ TickType_t xBlockTimeTicks )
181+ {
182+ NetworkBufferDescriptor_t * pxNetworkBuffer = ( NetworkBufferDescriptor_t * ) malloc ( sizeof ( NetworkBufferDescriptor_t ) );
183+
184+ if ( pxNetworkBuffer != NULL )
185+ {
186+ pxNetworkBuffer -> pucEthernetBuffer = malloc ( xRequestedSizeBytes + ipUDP_PAYLOAD_IP_TYPE_OFFSET );
187+ if ( pxNetworkBuffer -> pucEthernetBuffer == NULL )
188+ {
189+ free ( pxNetworkBuffer );
190+ pxNetworkBuffer = NULL ;
191+ }
192+ else
193+ {
194+ pxNetworkBuffer -> pucEthernetBuffer = ( (uint8_t * ) pxNetworkBuffer -> pucEthernetBuffer ) + ipUDP_PAYLOAD_IP_TYPE_OFFSET ;
195+ pxNetworkBuffer -> xDataLength = xRequestedSizeBytes ;
196+ }
197+ }
198+
199+ return pxNetworkBuffer ;
200+ }
201+
155202/****************************************************************
156203* The proof for FreeRTOS_gethostbyname.
157204****************************************************************/
@@ -160,12 +207,28 @@ void harness()
160207{
161208 size_t len ;
162209
210+ pxNetworkEndPoints = ( NetworkEndPoint_t * ) malloc ( sizeof ( NetworkEndPoint_t ) );
211+ __CPROVER_assume ( pxNetworkEndPoints != NULL );
212+
213+ /* Asserts are added in the src code to make sure ucDNSIndex
214+ will be less than ipconfigENDPOINT_DNS_ADDRESS_COUNT */
215+ __CPROVER_assume ( pxNetworkEndPoints -> ipv6_settings .ucDNSIndex < ipconfigENDPOINT_DNS_ADDRESS_COUNT );
216+ __CPROVER_assume ( pxNetworkEndPoints -> ipv4_settings .ucDNSIndex < ipconfigENDPOINT_DNS_ADDRESS_COUNT );
217+ pxNetworkEndPoints -> pxNext = NULL ;
218+
219+ /* Interface init. */
220+ pxNetworkEndPoints -> pxNetworkInterface = ( NetworkInterface_t * ) malloc ( sizeof ( NetworkInterface_t ) );
221+ __CPROVER_assume ( pxNetworkEndPoints -> pxNetworkInterface != NULL );
222+
223+ pxNetworkEndPoints -> pxNetworkInterface -> pfOutput = & NetworkInterfaceOutputFunction_Stub ;
224+
163225 __CPROVER_assume ( len <= MAX_HOSTNAME_LEN );
164- char * pcHostName = safeMalloc ( len );
226+ char * pcHostName = malloc ( len );
165227
166228 __CPROVER_assume ( len > 0 ); /* prvProcessDNSCache strcmp */
167229 __CPROVER_assume ( pcHostName != NULL );
168230 pcHostName [ len - 1 ] = NULL ;
169231
170232 FreeRTOS_gethostbyname ( pcHostName );
233+
171234}
0 commit comments