@ @ 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
| 739 | @ ensures \result!=\null ==> \initialized((char *)\result + (0 .. (le32(header->csectMiniFat) << le16(header->uSectorShift)) - 1)); |
| 740 | @*/ |
| 741 | static 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)); |
no test coverage detected