diff options
author | NeilBrown <neilb@suse.de> | 2008-07-18 16:37:16 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2008-07-18 16:37:16 +1000 |
commit | 7364918895b6b014d1a675c38973845cdf3baf41 (patch) | |
tree | 1025690bb5cbf057adb00929c918ba91b00fc8e9 | |
parent | 44d2e36556921e82a9fde02b554f799741c92531 (diff) | |
download | mdadm-7364918895b6b014d1a675c38973845cdf3baf41.tar.gz mdadm-7364918895b6b014d1a675c38973845cdf3baf41.tar.xz mdadm-7364918895b6b014d1a675c38973845cdf3baf41.zip |
Correct readlink usage in sysfs.c
readlink doesn't nul-terminate the returned string, so we must
be sure to do that.
Signed-off-by: Neil Brown <neilb@suse.de>
-rw-r--r-- | sysfs.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -374,14 +374,16 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd) memset(nm, 0, sizeof(nm)); sprintf(dv, "/sys/dev/block/%d:%d", sd->disk.major, sd->disk.minor); - if (readlink(dv, nm, sizeof(nm)) < 0) + rv = readlink(dv, nm, sizeof(nm)); + if (rv <= 0) return -1; + nm[rv] = '\0'; dname = strrchr(nm, '/'); if (dname) dname++; strcpy(sd->sys_name, "dev-"); strcpy(sd->sys_name+4, dname); - rv |= sysfs_set_num(sra, sd, "offset", sd->data_offset); + rv = sysfs_set_num(sra, sd, "offset", sd->data_offset); rv |= sysfs_set_num(sra, sd, "size", (sd->component_size+1) / 2); if (sra->array.level != LEVEL_CONTAINER) { rv |= sysfs_set_num(sra, sd, "slot", sd->disk.raid_disk); |