@@ -12,45 +12,9 @@ IotHttpsRequestHandle_t allocate_IotRequestHandle();
12
12
* without allocating memory.
13
13
*/
14
14
void * safeMalloc (size_t xWantedSize ) {
15
- if (xWantedSize == 0 ) {
16
- return NULL ;
17
- }
18
15
return nondet_bool () ? malloc (xWantedSize ) : NULL ;
19
16
}
20
17
21
- /****************************************************************/
22
-
23
- /* It is common for a buffer to contain a header struct followed by
24
- * user data. We optimize CBMC performance by allocating space for
25
- * the buffer using a struct with two members: the first member is the
26
- * header struct and the second member is the user data. This is
27
- * faster than just allocating a sequence of bytes large enough to
28
- * hold the header struct and the user data. We modeled
29
- * responseHandle, requestHandle and connectionHandle similarly.
30
- */
31
-
32
- // TODO: Replace this model of buffers with a model allowing
33
- // unconstrained sizes for the user data member, or at least
34
- // allowing a small set of differing sizes.
35
-
36
- typedef struct _responseHandle
37
- {
38
- struct _httpsResponse RespHandle ;
39
- char data [USER_DATA_SIZE ];
40
- } _resHandle_t ;
41
-
42
- typedef struct _requestHandle
43
- {
44
- struct _httpsRequest ReqHandle ;
45
- char data [USER_DATA_SIZE ];
46
- } _reqHandle_t ;
47
-
48
- typedef struct _connectionHandle
49
- {
50
- struct _httpsConnection pConnHandle ;
51
- char data [USER_DATA_SIZE ];
52
- } _connHandle_t ;
53
-
54
18
/****************************************************************
55
19
* HTTP parser stubs
56
20
****************************************************************/
@@ -216,7 +180,7 @@ IotHttpsConnectionInfo_t * allocate_IotConnectionInfo() {
216
180
pConnInfo -> pCaCert = safeMalloc (sizeof (uint32_t ));
217
181
pConnInfo -> pClientCert = safeMalloc (sizeof (uint32_t ));
218
182
pConnInfo -> pPrivateKey = safeMalloc (sizeof (uint32_t ));
219
- pConnInfo -> userBuffer .pBuffer = safeMalloc (sizeof (_connHandle_t ));
183
+ pConnInfo -> userBuffer .pBuffer = safeMalloc (sizeof (struct _httpsConnection ));
220
184
}
221
185
return pConnInfo ;
222
186
}
@@ -238,7 +202,7 @@ int is_valid_IotConnectionInfo(IotHttpsConnectionInfo_t *pConnInfo) {
238
202
/* Creates a Connection Handle and assigns memory accordingly. */
239
203
IotHttpsConnectionHandle_t allocate_IotConnectionHandle () {
240
204
IotHttpsConnectionHandle_t pConnectionHandle =
241
- safeMalloc (sizeof (_connHandle_t ));
205
+ safeMalloc (sizeof (struct _httpsConnection ));
242
206
if (pConnectionHandle ) {
243
207
// network connection just points to an allocated memory object
244
208
pConnectionHandle -> pNetworkConnection = safeMalloc (1 );
@@ -282,10 +246,13 @@ int is_valid_IotConnectionHandle(IotHttpsConnectionHandle_t handle) {
282
246
283
247
/* Creates a Response Handle and assigns memory accordingly. */
284
248
IotHttpsResponseHandle_t allocate_IotResponseHandle () {
285
- IotHttpsResponseHandle_t pResponseHandle = safeMalloc (sizeof (_resHandle_t ));
249
+ IotHttpsResponseHandle_t pResponseHandle =
250
+ safeMalloc (sizeof (struct _httpsResponse ));
286
251
if (pResponseHandle ) {
287
- uint32_t len ;
288
- pResponseHandle -> pBody = safeMalloc (len );
252
+ size_t headerLen ;
253
+ size_t bodyLen ;
254
+ pResponseHandle -> pHeaders = safeMalloc (headerLen );
255
+ pResponseHandle -> pBody = safeMalloc (bodyLen );
289
256
pResponseHandle -> pHttpsConnection = allocate_IotConnectionHandle ();
290
257
pResponseHandle -> pReadHeaderField =
291
258
safeMalloc (pResponseHandle -> readHeaderFieldLength );
@@ -295,6 +262,7 @@ IotHttpsResponseHandle_t allocate_IotResponseHandle() {
295
262
return pResponseHandle ;
296
263
}
297
264
265
+ // ???: Should be is_stubbed
298
266
IotHttpsResponseHandle_t
299
267
initialize_IotResponseHandle (IotHttpsResponseHandle_t pResponseHandle ) {
300
268
if (pResponseHandle ) {
@@ -304,26 +272,45 @@ initialize_IotResponseHandle(IotHttpsResponseHandle_t pResponseHandle) {
304
272
}
305
273
306
274
int is_valid_IotResponseHandle (IotHttpsResponseHandle_t pResponseHandle ) {
307
- int required =
275
+ int required1 =
308
276
__CPROVER_same_object (pResponseHandle -> pHeaders ,
309
277
pResponseHandle -> pHeadersCur ) &&
310
278
__CPROVER_same_object (pResponseHandle -> pHeaders ,
311
279
pResponseHandle -> pHeadersEnd );
312
- if (!required ) return 0 ;
280
+ int required2 =
281
+ __CPROVER_same_object (pResponseHandle -> pBody ,
282
+ pResponseHandle -> pBodyCur ) &&
283
+ __CPROVER_same_object (pResponseHandle -> pBody ,
284
+ pResponseHandle -> pBodyEnd );
285
+ if (!required1 || !required2 ) return 0 ;
313
286
314
287
int valid_headers =
315
- pResponseHandle -> pHeaders == (( _resHandle_t * ) pResponseHandle ) -> data ;
316
- int valid_order =
288
+ pResponseHandle -> pHeaders != NULL ;
289
+ int valid_header_order =
317
290
pResponseHandle -> pHeaders <= pResponseHandle -> pHeadersCur &&
318
291
pResponseHandle -> pHeadersCur <= pResponseHandle -> pHeadersEnd ;
292
+ int valid_body =
293
+ pResponseHandle -> pBody != NULL ;
294
+ int valid_body_order =
295
+ pResponseHandle -> pBody <= pResponseHandle -> pBodyCur &&
296
+ pResponseHandle -> pBodyCur <= pResponseHandle -> pBodyEnd ;
319
297
int valid_parserdata =
320
298
pResponseHandle -> httpParserInfo .readHeaderParser .data == pResponseHandle ;
321
299
return
322
300
valid_headers &&
323
- valid_order &&
301
+ valid_header_order &&
302
+ valid_body &&
303
+ valid_body_order &&
324
304
valid_parserdata &&
325
305
// valid_order and short circuit evaluation prevents integer overflow
326
- pResponseHandle -> pHeadersEnd - pResponseHandle -> pHeaders <= USER_DATA_SIZE ;
306
+ __CPROVER_r_ok (pResponseHandle -> pHeaders ,
307
+ pResponseHandle -> pHeadersEnd - pResponseHandle -> pHeaders ) &&
308
+ __CPROVER_w_ok (pResponseHandle -> pHeaders ,
309
+ pResponseHandle -> pHeadersEnd - pResponseHandle -> pHeaders ) &&
310
+ __CPROVER_r_ok (pResponseHandle -> pBody ,
311
+ pResponseHandle -> pBodyEnd - pResponseHandle -> pBody ) &&
312
+ __CPROVER_w_ok (pResponseHandle -> pBody ,
313
+ pResponseHandle -> pBodyEnd - pResponseHandle -> pBody );
327
314
}
328
315
329
316
/****************************************************************
@@ -332,12 +319,14 @@ int is_valid_IotResponseHandle(IotHttpsResponseHandle_t pResponseHandle) {
332
319
333
320
/* Creates a Request Handle and assigns memory accordingly. */
334
321
IotHttpsRequestHandle_t allocate_IotRequestHandle () {
335
- IotHttpsRequestHandle_t pRequestHandle = safeMalloc (sizeof (_reqHandle_t ));
322
+ IotHttpsRequestHandle_t pRequestHandle =
323
+ safeMalloc (sizeof (struct _httpsRequest ));
336
324
if (pRequestHandle ) {
337
- uint32_t len ;
325
+ uint32_t headerLen ;
338
326
pRequestHandle -> pHttpsResponse = allocate_IotResponseHandle ();
339
327
pRequestHandle -> pHttpsConnection = allocate_IotConnectionHandle ();
340
- pRequestHandle -> pBody = safeMalloc (len );
328
+ pRequestHandle -> pHeaders = safeMalloc (headerLen );
329
+ pRequestHandle -> pBody = safeMalloc (pRequestHandle -> bodyLength );
341
330
pRequestHandle -> pConnInfo = allocate_IotConnectionInfo ();
342
331
}
343
332
return pRequestHandle ;
@@ -352,18 +341,24 @@ int is_valid_IotRequestHandle(IotHttpsRequestHandle_t pRequestHandle) {
352
341
if (!required ) return 0 ;
353
342
354
343
int valid_headers =
355
- pRequestHandle -> pHeaders == (( _reqHandle_t * ) pRequestHandle ) -> data ;
344
+ pRequestHandle -> pHeaders != NULL ;
356
345
int valid_order =
357
346
pRequestHandle -> pHeaders <= pRequestHandle -> pHeadersCur &&
358
347
pRequestHandle -> pHeadersCur <= pRequestHandle -> pHeadersEnd ;
359
348
int valid_body =
360
349
pRequestHandle -> pBody != NULL ;
350
+ int bounded_header_buffer =
351
+ __CPROVER_OBJECT_SIZE (pRequestHandle -> pHeaders ) < CBMC_MAX_OBJECT_SIZE ;
361
352
return
362
353
valid_headers &&
363
354
valid_order &&
364
355
valid_body &&
356
+ bounded_header_buffer &&
365
357
// valid_order and short circuit evaluation prevents integer overflow
366
- pRequestHandle -> pHeadersEnd - pRequestHandle -> pHeaders <= USER_DATA_SIZE ;
358
+ __CPROVER_r_ok (pRequestHandle -> pHeaders ,
359
+ pRequestHandle -> pHeadersEnd - pRequestHandle -> pHeaders ) &&
360
+ __CPROVER_w_ok (pRequestHandle -> pHeaders ,
361
+ pRequestHandle -> pHeadersEnd - pRequestHandle -> pHeaders );
367
362
}
368
363
369
364
/****************************************************************
0 commit comments