libblkid: detect alone PMBR

wipefs(8) has to also erase PMBR, not GPR header only, otherwise the
device could be still interpreted as a device with a partition table.

Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1054186
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2014-01-20 10:51:00 +01:00
parent 4a2332edd9
commit e3c69a7d78
3 changed files with 44 additions and 2 deletions

View File

@ -155,13 +155,15 @@ static int last_lba(blkid_probe pr, uint64_t *lba)
* Note that the PMBR detection is optional (enabled by default) and could be
* disabled by BLKID_PARTS_FOPCE_GPT flag (see also blkid_paertitions_set_flags()).
*/
static int is_pmbr_valid(blkid_probe pr)
static int is_pmbr_valid(blkid_probe pr, int *has)
{
int flags = blkid_partitions_get_flags(pr);
unsigned char *data;
struct dos_partition *p;
int i;
if (has)
*has = 0;
if (flags & BLKID_PARTS_FORCE_GPT)
goto ok; /* skip PMBR check */
@ -179,6 +181,8 @@ static int is_pmbr_valid(blkid_probe pr)
failed:
return 0;
ok:
if (has)
*has = 1;
return 1;
}
@ -302,7 +306,7 @@ static int probe_gpt_pt(blkid_probe pr,
if (last_lba(pr, &lastlba))
goto nothing;
if (!is_pmbr_valid(pr))
if (!is_pmbr_valid(pr, NULL))
goto nothing;
h = get_gpt_header(pr, &hdr, &e, (lba = GPT_PRIMARY_LBA), lastlba);
@ -411,3 +415,39 @@ const struct blkid_idinfo gpt_pt_idinfo =
.magics = BLKID_NONE_MAGIC
};
/* probe for *alone* protective MBR */
static int probe_pmbr_pt(blkid_probe pr,
const struct blkid_idmag *mag __attribute__((__unused__)))
{
int has = 0;
struct gpt_entry *e;
uint64_t lastlba = 0;
struct gpt_header hdr;
if (last_lba(pr, &lastlba))
goto nothing;
is_pmbr_valid(pr, &has);
if (!has)
goto nothing;
if (!get_gpt_header(pr, &hdr, &e, GPT_PRIMARY_LBA, lastlba) &&
!get_gpt_header(pr, &hdr, &e, lastlba, lastlba))
return 0;
nothing:
return 1;
}
const struct blkid_idinfo pmbr_pt_idinfo =
{
.name = "PMBR",
.probefunc = probe_pmbr_pt,
.magics =
{
{ .magic = "\x55\xAA", .len = 2, .sboff = 510 },
{ NULL }
}
};

View File

@ -127,6 +127,7 @@ static const struct blkid_idinfo *idinfos[] =
&sun_pt_idinfo,
&dos_pt_idinfo,
&gpt_pt_idinfo,
&pmbr_pt_idinfo, /* always after GPT */
&mac_pt_idinfo,
&ultrix_pt_idinfo,
&bsd_pt_idinfo,

View File

@ -65,6 +65,7 @@ extern const struct blkid_idinfo mac_pt_idinfo;
extern const struct blkid_idinfo dos_pt_idinfo;
extern const struct blkid_idinfo minix_pt_idinfo;
extern const struct blkid_idinfo gpt_pt_idinfo;
extern const struct blkid_idinfo pmbr_pt_idinfo;
extern const struct blkid_idinfo ultrix_pt_idinfo;
#endif /* BLKID_PARTITIONS_H */