static int pi_dos_next_mbr(struct part_iter *iter, uint32_t *lba, struct disk_dos_part_entry **_dp) { struct disk_dos_part_entry *dp; while (++iter->index0 < 4) { dp = ((struct disk_dos_mbr *)iter->data)->table + iter->index0; if (notsane_primary(iter)) { iter->status = PI_INSANE; goto bail; } if (ost_is_ext(dp->ostype)) { if (iter->sub.dos.bebr_index0 >= 0) { error("You have more than 1 extended partition.\n"); iter->status = PI_INSANE; goto bail; } /* record base EBR index */ iter->sub.dos.bebr_index0 = iter->index0; } if (!ost_is_nondata(dp->ostype) || iter->stepall) { *lba = dp->start_lba; *_dp = dp; break; } } return 0; bail: return -1; }
static int dos_next_mbr(struct part_iter *iter, uint32_t *lba, struct disk_dos_part_entry **_dp) { struct disk_dos_part_entry *dp; while (++iter->index0 < 4) { dp = ((struct disk_dos_mbr *)iter->data)->table + iter->index0; if (notsane_primary(iter)) { iter->status = PI_INSANE; return -1; } if (ost_is_ext(dp->ostype)) { if (iter->dos.bebr_index0 >= 0) { error("More than 1 extended partition."); iter->status = PI_INSANE; return -1; } /* record base EBR index */ iter->dos.bebr_index0 = iter->index0; } if (!ost_is_nondata(dp->ostype) || (iter->flags & PIF_STEPALL)) { *lba = dp->start_lba; *_dp = dp; break; } } return 0; }
static int notsane_logical(const struct part_iter *iter) { const struct disk_dos_part_entry *dp; uint32_t end_log; dp = ((struct disk_dos_mbr *)iter->data)->table; if (!dp[0].ostype) return 0; if (ost_is_ext(dp[0].ostype)) { error("1st EBR entry must be data or empty.\n"); return -1; } end_log = dp[0].start_lba + dp[0].length; if (!dp[0].start_lba || !dp[0].length || !sane(dp[0].start_lba, dp[0].length) || end_log > iter->sub.dos.ebr_size) { error("Insane logical partition.\n"); return -1; } return 0; }
static int notsane_logical(const struct part_iter *iter) { const struct disk_dos_part_entry *dp; uint32_t end_log; dp = ((struct disk_dos_mbr *)iter->data)->table; if (!dp[0].ostype) return 0; if (ost_is_ext(dp[0].ostype)) { error("The 1st EBR entry must be data or empty."); return -1; } if (iter->flags & PIF_RELAX) return 0; end_log = dp[0].start_lba + dp[0].length; if (!dp[0].start_lba || !dp[0].length || !sane(dp[0].start_lba, dp[0].length) || end_log > iter->dos.nebr_siz) { error("Logical partition (in EBR) with invalid offset and/or length."); return -1; } return 0; }