@ @ requires file_recovery->file_rename==&file_rename_doc; @ requires valid_file_rename_param(file_recovery); @ ensures valid_file_rename_result(file_recovery); @*/
| 1553 | @ ensures valid_file_rename_result(file_recovery); |
| 1554 | @*/ |
| 1555 | static void file_rename_doc(file_recovery_t *file_recovery) |
| 1556 | { |
| 1557 | const char *ext=NULL; |
| 1558 | char title[1024]; |
| 1559 | FILE *file; |
| 1560 | unsigned char buffer_header[512]; |
| 1561 | uint32_t *fat; |
| 1562 | const struct OLE_HDR *header=(const struct OLE_HDR*)&buffer_header; |
| 1563 | /*@ assert \valid_read(header); */ |
| 1564 | time_t file_time=0; |
| 1565 | unsigned int fat_entries; |
| 1566 | unsigned int uSectorShift; |
| 1567 | unsigned int num_FAT_blocks; |
| 1568 | title[0]='\0'; |
| 1569 | /*@ assert valid_string(&title[0]); */ |
| 1570 | if(strstr(file_recovery->filename, ".sdd")!=NULL) |
| 1571 | ext=extension_sdd; |
| 1572 | if((file=fopen(file_recovery->filename, "rb"))==NULL) |
| 1573 | return; |
| 1574 | #ifdef DEBUG_OLE |
| 1575 | log_info("file_rename_doc(%s)\n", file_recovery->filename); |
| 1576 | #endif |
| 1577 | /*reads first sector including OLE header */ |
| 1578 | if(my_fseek(file, 0, SEEK_SET) < 0 || |
| 1579 | fread(&buffer_header, sizeof(buffer_header), 1, file) != 1) |
| 1580 | { |
| 1581 | fclose(file); |
| 1582 | return ; |
| 1583 | } |
| 1584 | #if defined(__FRAMAC__) |
| 1585 | Frama_C_make_unknown((char *)&buffer_header, sizeof(buffer_header)); |
| 1586 | #endif |
| 1587 | uSectorShift=le16(header->uSectorShift); |
| 1588 | num_FAT_blocks=le32(header->num_FAT_blocks); |
| 1589 | /* Sanity check */ |
| 1590 | if( uSectorShift != 9 && uSectorShift != 12) |
| 1591 | { |
| 1592 | fclose(file); |
| 1593 | return ; |
| 1594 | } |
| 1595 | /*@ assert 9 == uSectorShift || 12 == uSectorShift; */ |
| 1596 | if(le16(header->uMiniSectorShift) != 6) |
| 1597 | { |
| 1598 | fclose(file); |
| 1599 | return ; |
| 1600 | } |
| 1601 | /* Sanity check */ |
| 1602 | if(num_FAT_blocks==0 || |
| 1603 | le32(header->num_extra_FAT_blocks)>50) |
| 1604 | { |
| 1605 | fclose(file); |
| 1606 | return ; |
| 1607 | } |
| 1608 | /*@ assert num_FAT_blocks > 0; */ |
| 1609 | /*@ assert 0 <= le32(header->num_extra_FAT_blocks) <= 50; */ |
| 1610 | if(num_FAT_blocks > 109+le32(header->num_extra_FAT_blocks)*((1<<uSectorShift)/4-1)) |
| 1611 | { |
| 1612 | fclose(file); |
no test coverage detected