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_extended(const struct part_iter *iter) { const struct disk_dos_part_entry *dp; uint32_t end_ebr; dp = ((struct disk_dos_mbr *)iter->data)->table; if (!dp[1].ostype) return 0; if (!ost_is_nondata(dp[1].ostype)) { error("2nd EBR entry must be extended or empty.\n"); return -1; } end_ebr = dp[1].start_lba + dp[1].length; if (!dp[1].start_lba || !dp[1].length || !sane(dp[1].start_lba, dp[1].length) || end_ebr > iter->sub.dos.bebr_size) { error("Insane extended partition.\n"); return -1; } return 0; }
static int notsane_extended(const struct part_iter *iter) { const struct disk_dos_part_entry *dp; uint32_t end_ebr; dp = ((struct disk_dos_mbr *)iter->data)->table; if (!dp[1].ostype) return 0; if (!ost_is_nondata(dp[1].ostype)) { error("The 2nd EBR entry must be extended or empty."); return -1; } if (iter->flags & PIF_RELAX) return 0; end_ebr = dp[1].start_lba + dp[1].length; if (!dp[1].start_lba || !dp[1].length || !sane(dp[1].start_lba, dp[1].length) || end_ebr > iter->dos.bebr_siz) { error("Extended partition (EBR) with invalid offset and/or length."); return -1; } return 0; }