Skip to content

Commit 67b44e7

Browse files
karkhazMark R. Tuttle
authored and
Mark R. Tuttle
committed
Remove {r,w}_ok from is_valid_IotResponseHandle
This commit attempts to preserve the functionality of the memory checks in is_valid_IotResponseHandle until the issue in diffblue/cbmc#5194 is sorted out. This commit is needed because is_valid_IotRequestHandle and is_valid_IotResponseHandle use the __CPROVER_r_ok and __CPROVER_w_ok macros, and they are used inside an assume statement, triggering the issue mentioned in that bug.
1 parent d00f620 commit 67b44e7

File tree

1 file changed

+48
-43
lines changed

1 file changed

+48
-43
lines changed

tools/cbmc/proofs/HTTP/global_state_HTTP.c

Lines changed: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -272,45 +272,52 @@ initialize_IotResponseHandle(IotHttpsResponseHandle_t pResponseHandle) {
272272
}
273273

274274
int is_valid_IotResponseHandle(IotHttpsResponseHandle_t pResponseHandle) {
275-
int required1 =
275+
int valid_headers =
276+
pResponseHandle->pHeaders != NULL;
277+
int valid_body =
278+
pResponseHandle->pBody != NULL;
279+
280+
int valid_parserdata =
281+
pResponseHandle->httpParserInfo.readHeaderParser.data == pResponseHandle;
282+
283+
size_t header_size = __CPROVER_OBJECT_SIZE(pResponseHandle->pHeaders);
284+
bool valid_header_pointers =
285+
header_size < CBMC_MAX_OBJECT_SIZE &&
286+
287+
__CPROVER_POINTER_OFFSET(pResponseHandle->pHeaders) < header_size &&
288+
__CPROVER_POINTER_OFFSET(pResponseHandle->pHeadersCur) < header_size &&
289+
__CPROVER_POINTER_OFFSET(pResponseHandle->pHeadersEnd) < header_size &&
290+
276291
__CPROVER_same_object(pResponseHandle->pHeaders,
277292
pResponseHandle->pHeadersCur) &&
278293
__CPROVER_same_object(pResponseHandle->pHeaders,
279-
pResponseHandle->pHeadersEnd);
280-
int required2 =
294+
pResponseHandle->pHeadersEnd) &&
295+
296+
pResponseHandle->pHeaders <= pResponseHandle->pHeadersCur &&
297+
pResponseHandle->pHeadersCur <= pResponseHandle->pHeadersEnd;
298+
299+
size_t body_size = __CPROVER_OBJECT_SIZE(pResponseHandle->pBody);
300+
bool valid_body_pointers =
301+
body_size < CBMC_MAX_OBJECT_SIZE &&
302+
303+
__CPROVER_POINTER_OFFSET(pResponseHandle->pBody) < body_size &&
304+
__CPROVER_POINTER_OFFSET(pResponseHandle->pBodyCur) < body_size &&
305+
__CPROVER_POINTER_OFFSET(pResponseHandle->pBodyEnd) < body_size &&
306+
281307
__CPROVER_same_object(pResponseHandle->pBody,
282308
pResponseHandle->pBodyCur) &&
283309
__CPROVER_same_object(pResponseHandle->pBody,
284-
pResponseHandle->pBodyEnd);
285-
if (!required1 || !required2) return 0;
310+
pResponseHandle->pBodyEnd) &&
286311

287-
int valid_headers =
288-
pResponseHandle->pHeaders != NULL;
289-
int valid_header_order =
290-
pResponseHandle->pHeaders <= pResponseHandle->pHeadersCur &&
291-
pResponseHandle->pHeadersCur <= pResponseHandle->pHeadersEnd;
292-
int valid_body =
293-
pResponseHandle->pBody != NULL;
294-
int valid_body_order =
295312
pResponseHandle->pBody <= pResponseHandle->pBodyCur &&
296313
pResponseHandle->pBodyCur <= pResponseHandle->pBodyEnd;
297-
int valid_parserdata =
298-
pResponseHandle->httpParserInfo.readHeaderParser.data == pResponseHandle;
314+
299315
return
300316
valid_headers &&
301-
valid_header_order &&
302317
valid_body &&
303-
valid_body_order &&
304318
valid_parserdata &&
305-
// valid_order and short circuit evaluation prevents integer overflow
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);
319+
valid_header_pointers &&
320+
valid_body_pointers;
314321
}
315322

316323
/****************************************************************
@@ -333,32 +340,30 @@ IotHttpsRequestHandle_t allocate_IotRequestHandle() {
333340
}
334341

335342
int is_valid_IotRequestHandle(IotHttpsRequestHandle_t pRequestHandle) {
336-
int required =
343+
int valid_headers = pRequestHandle->pHeaders != NULL;
344+
int valid_body = pRequestHandle->pBody != NULL;
345+
346+
size_t header_size = __CPROVER_OBJECT_SIZE(pRequestHandle->pHeaders);
347+
348+
bool valid_header_pointers =
349+
header_size < CBMC_MAX_OBJECT_SIZE &&
350+
351+
__CPROVER_POINTER_OFFSET(pRequestHandle->pHeaders) < header_size &&
352+
__CPROVER_POINTER_OFFSET(pRequestHandle->pHeadersCur) < header_size &&
353+
__CPROVER_POINTER_OFFSET(pRequestHandle->pHeadersEnd) < header_size &&
354+
337355
__CPROVER_same_object(pRequestHandle->pHeaders,
338356
pRequestHandle->pHeadersCur) &&
339357
__CPROVER_same_object(pRequestHandle->pHeaders,
340-
pRequestHandle->pHeadersEnd);
341-
if (!required) return 0;
358+
pRequestHandle->pHeadersEnd) &&
342359

343-
int valid_headers =
344-
pRequestHandle->pHeaders != NULL;
345-
int valid_order =
346360
pRequestHandle->pHeaders <= pRequestHandle->pHeadersCur &&
347361
pRequestHandle->pHeadersCur <= pRequestHandle->pHeadersEnd;
348-
int valid_body =
349-
pRequestHandle->pBody != NULL;
350-
int bounded_header_buffer =
351-
__CPROVER_OBJECT_SIZE(pRequestHandle->pHeaders) < CBMC_MAX_OBJECT_SIZE;
362+
352363
return
353364
valid_headers &&
354-
valid_order &&
355365
valid_body &&
356-
bounded_header_buffer &&
357-
// valid_order and short circuit evaluation prevents integer overflow
358-
__CPROVER_r_ok(pRequestHandle->pHeaders,
359-
pRequestHandle->pHeadersEnd - pRequestHandle->pHeaders) &&
360-
__CPROVER_w_ok(pRequestHandle->pHeaders,
361-
pRequestHandle->pHeadersEnd - pRequestHandle->pHeaders);
366+
valid_header_pointers;
362367
}
363368

364369
/****************************************************************

0 commit comments

Comments
 (0)