diff options
author | Richard Yao <[email protected]> | 2014-01-09 12:52:10 -0500 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-04-08 14:45:12 -0700 |
commit | 787c455ed7a519bbf2e56140621259eb7b23b6fb (patch) | |
tree | f4733e9d9999e0169114a050cd5e89deb0866553 /lib | |
parent | b79e1f1f27e72e0603beb176c9d8e4c78bc62c95 (diff) |
Improve partition detection on lesser used devices
The format strings in efi_get_info() are intended to extract both the
main device and partition number. However, this is only done correctly
for hd, sd and vd devices. The format strings for ram, dm-, md and loop
devices misparse the input. This causes the partition device to be
incorrectly labelled as the main device with the partition being
labelled 0.
Reported-by: ilovezfs <[email protected]>
Signed-off-by: Richard Yao <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Issue #2175
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libefi/rdwr_efi.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/libefi/rdwr_efi.c b/lib/libefi/rdwr_efi.c index 2807fb070..19a573c0b 100644 --- a/lib/libefi/rdwr_efi.c +++ b/lib/libefi/rdwr_efi.c @@ -194,8 +194,9 @@ efi_get_info(int fd, struct dk_cinfo *dki_info) } else if ((strncmp(dev_path, "/dev/md", 7) == 0)) { strcpy(dki_info->dki_cname, "pseudo"); dki_info->dki_ctype = DKC_MD; - rval = sscanf(dev_path, "/dev/%[a-zA-Z0-9]p%hu", - dki_info->dki_dname, + strcpy(dki_info->dki_dname, "md"); + rval = sscanf(dev_path, "/dev/md%[0-9]p%hu", + dki_info->dki_dname + 2, &dki_info->dki_partition); } else if ((strncmp(dev_path, "/dev/vd", 7) == 0)) { strcpy(dki_info->dki_cname, "vd"); @@ -206,20 +207,23 @@ efi_get_info(int fd, struct dk_cinfo *dki_info) } else if ((strncmp(dev_path, "/dev/dm-", 8) == 0)) { strcpy(dki_info->dki_cname, "pseudo"); dki_info->dki_ctype = DKC_VBD; - rval = sscanf(dev_path, "/dev/%[a-zA-Z0-9-]p%hu", - dki_info->dki_dname, + strcpy(dki_info->dki_dname, "dm-"); + rval = sscanf(dev_path, "/dev/dm-%[0-9]p%hu", + dki_info->dki_dname + 3, &dki_info->dki_partition); } else if ((strncmp(dev_path, "/dev/ram", 8) == 0)) { strcpy(dki_info->dki_cname, "pseudo"); dki_info->dki_ctype = DKC_PCMCIA_MEM; - rval = sscanf(dev_path, "/dev/%[a-zA-Z0-9]p%hu", - dki_info->dki_dname, + strcpy(dki_info->dki_dname, "ram"); + rval = sscanf(dev_path, "/dev/ram%[0-9]p%hu", + dki_info->dki_dname + 3, &dki_info->dki_partition); } else if ((strncmp(dev_path, "/dev/loop", 9) == 0)) { strcpy(dki_info->dki_cname, "pseudo"); dki_info->dki_ctype = DKC_VBD; - rval = sscanf(dev_path, "/dev/%[a-zA-Z0-9]p%hu", - dki_info->dki_dname, + strcpy(dki_info->dki_dname, "loop"); + rval = sscanf(dev_path, "/dev/loop%[0-9]p%hu", + dki_info->dki_dname + 4, &dki_info->dki_partition); } else { strcpy(dki_info->dki_dname, "unknown"); |