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

Function check_MD

src/md.c:229–369  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

227#endif
228
229int check_MD(disk_t *disk_car, partition_t *partition, const int verbose)
230{
231#ifndef DISABLED_FOR_FRAMAC
232 unsigned char *buffer=(unsigned char*)MALLOC(MD_SB_BYTES);
233 /* MD version 1.1 */
234 if(disk_car->pread(disk_car, buffer, MD_SB_BYTES, partition->part_offset) == MD_SB_BYTES)
235 {
236 const struct mdp_superblock_1 *sb1=(const struct mdp_superblock_1 *)buffer;
237 if(le32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC &&
238 le32(sb1->major_version)==1 &&
239 le64(sb1->super_offset)==0 &&
240 test_MD(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0)
241 {
242#ifndef DISABLED_FOR_FRAMAC
243 log_info("check_MD 1.1\n");
244#endif
245 set_MD_info((struct mdp_superblock_s*)buffer, partition, verbose);
246 free(buffer);
247 return 0;
248 }
249 if(be32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC &&
250 be32(sb1->major_version)==1 &&
251 be64(sb1->super_offset)==0 &&
252 test_MD_be(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0)
253 {
254#ifndef DISABLED_FOR_FRAMAC
255 log_info("check_MD 1.1 (BigEndian)\n");
256#endif
257 set_MD_info_be((struct mdp_superblock_s*)buffer, partition, verbose);
258 free(buffer);
259 return 0;
260 }
261 }
262 /* MD version 1.2 */
263 if(disk_car->pread(disk_car, buffer, MD_SB_BYTES, partition->part_offset + 4096) == MD_SB_BYTES)
264 {
265 const struct mdp_superblock_1 *sb1=(const struct mdp_superblock_1 *)buffer;
266 if(le32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC &&
267 le32(sb1->major_version)==1 &&
268 le64(sb1->super_offset)==8 &&
269 test_MD(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0)
270 {
271#ifndef DISABLED_FOR_FRAMAC
272 log_info("check_MD 1.2\n");
273#endif
274 set_MD_info((struct mdp_superblock_s*)buffer, partition, verbose);
275 free(buffer);
276 return 0;
277 }
278 if(be32(sb1->md_magic)==(unsigned int)MD_SB_MAGIC &&
279 be32(sb1->major_version)==1 &&
280 be64(sb1->super_offset)==8 &&
281 test_MD_be(disk_car, (struct mdp_superblock_s*)buffer, partition, 0)==0)
282 {
283#ifndef DISABLED_FOR_FRAMAC
284 log_info("check_MD 1.2 (BigEndian)\n");
285#endif
286 set_MD_info_be((struct mdp_superblock_s*)buffer, partition, verbose);

Callers 4

check_part_gptFunction · 0.85
check_part_sunFunction · 0.85
check_part_noneFunction · 0.85
check_part_i386Function · 0.85

Calls 5

MALLOCFunction · 0.85
test_MDFunction · 0.85
set_MD_infoFunction · 0.85
test_MD_beFunction · 0.85
set_MD_info_beFunction · 0.85

Tested by

no test coverage detected