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

Function fat16_remove_used_space

src/fatp.c:107–149  ·  view source on GitHub ↗

@ @ requires \valid(disk_car); @ requires valid_disk(disk_car); @ requires \valid_read(partition); @ requires valid_partition(partition); @ requires \valid(list_search_space); @ requires \separated(disk_car, partition, list_search_space); @ decreases 0; @*/

Source from the content-addressed store, hash-verified

105 @ decreases 0;
106 @*/
107static void fat16_remove_used_space(disk_t *disk_car,const partition_t *partition, alloc_data_t *list_search_space, const unsigned int fat_offset, const unsigned int no_of_cluster, const unsigned int start_data, const unsigned int cluster_size, const unsigned int sector_size)
108{
109 unsigned char *buffer;
110 const uint16_t *p16;
111 unsigned int prev_cluster;
112 uint64_t hd_offset=partition->part_offset+(uint64_t)fat_offset*sector_size;
113 uint64_t start_free=0;
114 uint64_t end_free=0;
115 log_trace("fat16_remove_used_space\n");
116 buffer=(unsigned char *)MALLOC(sector_size);
117 p16=(const uint16_t*)buffer;
118 del_search_space(list_search_space, partition->part_offset,
119 partition->part_offset + (uint64_t)start_data * sector_size - 1);
120 for(prev_cluster=2;prev_cluster<=no_of_cluster+1;prev_cluster++)
121 {
122 unsigned int offset_o;
123 offset_o=prev_cluster%(sector_size/2);
124 if((offset_o==0)||(prev_cluster==2))
125 {
126 if((unsigned)disk_car->pread(disk_car, buffer, sector_size, hd_offset) != sector_size)
127 {
128 /* Consider these FAT sectors points to free clusters */
129 }
130 hd_offset+=sector_size;
131 }
132 if(le16(p16[offset_o])!=0)
133 {
134 /* Not free */
135 if(end_free+1==partition->part_offset+(start_data+(uint64_t)(prev_cluster-2)*cluster_size)*sector_size)
136 end_free+=cluster_size*sector_size;
137 else
138 {
139 if(start_free != end_free)
140 del_search_space(list_search_space, start_free, end_free);
141 start_free=partition->part_offset+(start_data+(uint64_t)(prev_cluster-2)*cluster_size)*sector_size;
142 end_free=start_free+(uint64_t)cluster_size*sector_size-1;
143 }
144 }
145 }
146 free(buffer);
147 if(start_free != end_free)
148 del_search_space(list_search_space, start_free, end_free);
149}
150
151/*@
152 @ requires \valid(disk_car);

Callers 1

fat_remove_used_spaceFunction · 0.85

Calls 2

MALLOCFunction · 0.85
del_search_spaceFunction · 0.85

Tested by

no test coverage detected