@ @ requires 48 <= dirLen <= 1024*1024; @ requires \valid_read(dataPt + (0 .. dirLen-1)); @ requires \initialized(dataPt + (0 .. dirLen-1)); @ requires \valid(ext); @ requires \valid(title + (0 .. 1024-1)); @ requires \valid(file_time); @ requires valid_string(title); @ requires *ext == \null || valid_read_string(*ext); @ requires separation: \separated(dataPt+(..), ext, title +
| 1345 | @ assigns *ext, *(title + (0..1023)), *file_time; |
| 1346 | @*/ |
| 1347 | static void OLE_parse_summary_aux(const char *dataPt, const unsigned int dirLen, const char **ext, char *title, time_t *file_time) |
| 1348 | { |
| 1349 | unsigned int pos; |
| 1350 | const unsigned char *udataPt=(const unsigned char *)dataPt; |
| 1351 | #ifndef DISABLED_FOR_FRAMAC |
| 1352 | assert(dirLen >= 48 && dirLen<=1024*1024); |
| 1353 | #endif |
| 1354 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 1355 | /*@ assert valid_string(title); */ |
| 1356 | #ifdef DEBUG_OLE |
| 1357 | dump_log(dataPt, dirLen); |
| 1358 | #endif |
| 1359 | /*@ assert \valid_read(udataPt + (0 .. dirLen-1)); */ |
| 1360 | if(udataPt[0]!=0xfe || udataPt[1]!=0xff) |
| 1361 | return ; |
| 1362 | pos=get32u(dataPt, 44); |
| 1363 | if(pos > dirLen - 8) |
| 1364 | { |
| 1365 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 1366 | /*@ assert valid_string(title); */ |
| 1367 | return ; |
| 1368 | } |
| 1369 | /*@ assert 0 <= pos <= dirLen - 8; */ |
| 1370 | { |
| 1371 | /* PropertySet */ |
| 1372 | const unsigned int size=get32u(dataPt, pos); |
| 1373 | if(size <= 8 || size > dirLen || pos + size > dirLen) |
| 1374 | { |
| 1375 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 1376 | /*@ assert valid_string(title); */ |
| 1377 | return ; |
| 1378 | } |
| 1379 | /*@ assert size > 8 && size <= dirLen && pos + size <= dirLen; */ |
| 1380 | |
| 1381 | /*@ assert 0 < dirLen <=1024*1024; */ |
| 1382 | /*@ assert \valid_read(dataPt + (0 .. dirLen-1)); */ |
| 1383 | /*@ assert pos + size <= dirLen; */ |
| 1384 | /*@ assert \valid_read(dataPt + (0 .. pos+size-1)); */ |
| 1385 | /*@ assert \valid_read(dataPt + pos + (0 .. size-1)); */ |
| 1386 | |
| 1387 | /*@ assert 0 < dirLen <=1024*1024; */ |
| 1388 | /*@ assert \initialized(dataPt + (0 .. dirLen-1)); */ |
| 1389 | /*@ assert pos + size <= dirLen; */ |
| 1390 | /*@ ghost int small_dirLen = pos + size; */ |
| 1391 | /*@ assert small_dirLen <= dirLen; */ |
| 1392 | /*@ assert \initialized(dataPt + (0 .. small_dirLen-1)); */ |
| 1393 | |
| 1394 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 1395 | /*@ assert valid_string(title); */ |
| 1396 | OLE_parse_PropertySet(&dataPt[pos], size, ext, title, file_time); |
| 1397 | } |
| 1398 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 1399 | /*@ assert valid_string(title); */ |
| 1400 | } |
| 1401 | |
| 1402 | /*@ |
| 1403 | @ requires \valid_read(ministream + (0 .. ministream_size-1)); |
no test coverage detected