MCPcopy Create free account
hub / github.com/cgsecurity/testdisk / file_rename_doc

Function file_rename_doc

src/file_doc.c:1555–1798  ·  view source on GitHub ↗

@ @ requires file_recovery->file_rename==&file_rename_doc; @ requires valid_file_rename_param(file_recovery); @ ensures valid_file_rename_result(file_recovery); @*/

Source from the content-addressed store, hash-verified

1553 @ ensures valid_file_rename_result(file_recovery);
1554 @*/
1555static 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);

Callers 1

mainFunction · 0.85

Calls 8

my_fseekFunction · 0.85
OLE_load_FATFunction · 0.85
MALLOCFunction · 0.85
OLE_read_blockFunction · 0.85
entry2extFunction · 0.85
OLE_parse_summaryFunction · 0.85
set_dateFunction · 0.85
file_renameFunction · 0.85

Tested by

no test coverage detected