| 84 | } |
| 85 | |
| 86 | int 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 | |
| 123 | static void set_HFS_info(partition_t *partition, const hfs_mdb_t *hfs_mdb) |
| 124 | { |
no test coverage detected