From: Dan Williams Date: Fri, 26 Aug 2011 02:14:19 +0000 (-0700) Subject: sysfs: fix sysfs_disk_to_scsi_id X-Git-Tag: mdadm-3.2.3~177 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8924477b7fc513a54249b1b0c617adbfb78c7fe;p=thirdparty%2Fmdadm.git sysfs: fix sysfs_disk_to_scsi_id Not sure how this ever worked, but now we just try to parse a directory name that looks like :::. Array creation segfaults on Fedora 14 without this. Signed-off-by: Dan Williams Signed-off-by: NeilBrown --- diff --git a/sysfs.c b/sysfs.c index 56813b7d..21462642 100644 --- a/sysfs.c +++ b/sysfs.c @@ -709,9 +709,9 @@ int sysfs_disk_to_scsi_id(int fd, __u32 *id) /* from an open block device, try to retrieve it scsi_id */ struct stat st; char path[256]; - char *c1, *c2; DIR *dir; struct dirent *de; + int host, bus, target, lun; if (fstat(fd, &st)) return 1; @@ -723,32 +723,22 @@ int sysfs_disk_to_scsi_id(int fd, __u32 *id) if (!dir) return 1; - de = readdir(dir); - while (de) { - if (strchr(de->d_name, ':')) + for (de = readdir(dir); de; de = readdir(dir)) { + int count; + + if (de->d_type != DT_DIR) + continue; + + count = sscanf(de->d_name, "%d:%d:%d:%d", &host, &bus, &target, &lun); + if (count == 4) break; - de = readdir(dir); } closedir(dir); if (!de) return 1; - c1 = de->d_name; - c2 = strchr(c1, ':'); - *c2 = '\0'; - *id = strtol(c1, NULL, 10) << 24; /* host */ - c1 = c2 + 1; - c2 = strchr(c1, ':'); - *c2 = '\0'; - *id |= strtol(c1, NULL, 10) << 16; /* bus */ - c1 = c2 + 1; - c2 = strchr(c1, ':'); - *c2 = '\0'; - *id |= strtol(c1, NULL, 10) << 8; /* target */ - c1 = c2 + 1; - *id |= strtol(c1, NULL, 10); /* lun */ - + *id = (host << 24) | (bus << 16) | (target << 8) | (lun << 0); return 0; }