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

Function OLE_load_MiniFAT

src/file_doc.c:741–784  ·  view source on GitHub ↗

@ @ requires \valid(IN); @ requires \valid_read(header); @ requires \valid_read(fat); @ requires 9 == le16(header->uSectorShift) || 12 == le16(header->uSectorShift); @ requires le32(header->csectMiniFat) <= 2048; @ ensures \result!=\null ==> \valid((char *)\result + (0 .. (le32(header->csectMiniFat) << le16(header->uSectorShift)) - 1)); @ ensures \result!=\null ==> \initialized((char

Source from the content-addressed store, hash-verified

739 @ ensures \result!=\null ==> \initialized((char *)\result + (0 .. (le32(header->csectMiniFat) << le16(header->uSectorShift)) - 1));
740 @*/
741static uint32_t *OLE_load_MiniFAT(FILE *IN, const struct OLE_HDR *header, const uint32_t *fat, const unsigned int fat_entries, const uint64_t offset)
742{
743 char *minifat;
744 unsigned int block;
745 unsigned int i;
746 const unsigned int uSectorShift=le16(header->uSectorShift);
747 const unsigned int csectMiniFat=le32(header->csectMiniFat);
748 /*@ assert uSectorShift==9 || uSectorShift==12; */
749 /*@ assert csectMiniFat <= 2048; */
750 const unsigned int minifat_length=csectMiniFat << uSectorShift;
751 if(csectMiniFat==0)
752 return NULL;
753 /*@ assert 0 < csectMiniFat; */
754 /*@ assert 0 < csectMiniFat <= 2048; */
755#ifdef DISABLED_FOR_FRAMAC
756 minifat=(char *)MALLOC(2048 << 12);
757#else
758 minifat=(char *)MALLOC(minifat_length);
759#endif
760 block=le32(header->MiniFat_block);
761 /*@
762 @ loop invariant 0 <= i <= csectMiniFat;
763 @ loop invariant i > 0 ==> \initialized(minifat + ((i-1)<<uSectorShift) + (0 .. (1<<uSectorShift)- 1));
764 @ loop invariant i > 0 ==> \initialized(minifat + (0 .. (i<<uSectorShift)- 1));
765 @ loop variant csectMiniFat-i;
766 @*/
767 for(i=0; i < csectMiniFat; i++)
768 {
769 if(block >= fat_entries)
770 {
771 free(minifat);
772 return NULL;
773 }
774 if(OLE_read_block(IN, minifat + (i << uSectorShift), uSectorShift, block, offset)<0)
775 {
776 free(minifat);
777 return NULL;
778 }
779 block=le32(fat[block]);
780 }
781 /*@ assert \initialized(minifat + (0 .. (csectMiniFat<<uSectorShift)- 1)); */
782 /*@ assert \initialized(minifat + (0 .. (le32(header->csectMiniFat) << le16(header->uSectorShift))- 1)); */
783 return (uint32_t *)minifat;
784}
785
786/*@
787 @ requires \valid_read((char *)buffer + (offset .. offset + 4 - 1));

Callers 1

OLE_parse_summaryFunction · 0.85

Calls 2

MALLOCFunction · 0.85
OLE_read_blockFunction · 0.85

Tested by

no test coverage detected