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

Function test_HFS

src/hfs.c:86–121  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

84}
85
86int test_HFS(const disk_t *disk_car, const hfs_mdb_t *hfs_mdb, const partition_t *partition, const int verbose, const int dump_ind)
87{
88 /* Check for HFS signature */
89 if (hfs_mdb->drSigWord!=be16(HFS_SUPER_MAGIC))
90 return 1;
91 /* Blocksize must be a multiple of 512 */
92 if(be32(hfs_mdb->drAlBlkSiz)<512 ||
93 ((be32(hfs_mdb->drAlBlkSiz)-1) & be32(hfs_mdb->drAlBlkSiz))!=0)
94 return 1;
95 /* Check for valid number of allocation blocks */
96 if(be16(hfs_mdb->drNmAlBlks)==0)
97 return 1;
98 /* Check for coherent block numbers */
99 if(be16(hfs_mdb->drFreeBks) > be16(hfs_mdb->drNmAlBlks))
100 return 1;
101 /* Size must be less than 2TB (tolerate a little bit more)*/
102 if((uint64_t)be16(hfs_mdb->drNmAlBlks)*be32(hfs_mdb->drAlBlkSiz)+be16(hfs_mdb->drAlBlSt)*512+0x400 > (uint64_t)2049*1024*1024*1024)
103 return 1;
104 if(verbose>0 || dump_ind!=0)
105 {
106 log_info("\nHFS magic value at %u/%u/%u\n", offset2cylinder(disk_car,partition->part_offset),offset2head(disk_car,partition->part_offset),offset2sector(disk_car,partition->part_offset));
107 }
108 if(dump_ind!=0)
109 {
110 /* There is a little offset ... */
111 dump_log(hfs_mdb,DEFAULT_SECTOR_SIZE);
112 }
113 if(verbose>1)
114 {
115 log_info("drNmAlBlks %u\n",(unsigned) be16(hfs_mdb->drNmAlBlks));
116 log_info("drAlBlkSiz %u\n",(unsigned) be32(hfs_mdb->drAlBlkSiz));
117 log_info("drAlBlSt %u\n",(unsigned) be16(hfs_mdb->drAlBlSt));
118 log_info("drFreeBks %u\n",(unsigned) be16(hfs_mdb->drFreeBks));
119 }
120 return 0;
121}
122
123static void set_HFS_info(partition_t *partition, const hfs_mdb_t *hfs_mdb)
124{

Callers 3

check_HFSFunction · 0.85
recover_HFSFunction · 0.85

Calls 4

offset2cylinderFunction · 0.85
offset2headFunction · 0.85
offset2sectorFunction · 0.85
dump_logFunction · 0.85

Tested by

no test coverage detected