]> granicus.if.org Git - zfs/commitdiff
Improve partition detection on lesser used devices
authorRichard Yao <ryao@gentoo.org>
Thu, 9 Jan 2014 17:52:10 +0000 (12:52 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 8 Apr 2014 21:45:12 +0000 (14:45 -0700)
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 <ilovezfs@icloud.com>
Signed-off-by: Richard Yao <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #2175

lib/libefi/rdwr_efi.c

index 2807fb0702b87c9c3ed53d6b6b3fcf90b1c52cc9..19a573c0b1bd725c5a8ed4216749c8f66922961b 100644 (file)
@@ -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");