You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.5 KiB
133 lines
4.5 KiB
From 84d969be8f6d8a345b75f558fad26e4f62a558f6 Mon Sep 17 00:00:00 2001 |
|
From: Kinga Tanska <kinga.tanska@intel.com> |
|
Date: Thu, 14 Jul 2022 09:02:11 +0200 |
|
Subject: [PATCH 30/52] Monitor: use snprintf to fill device name |
|
|
|
Safe string functions are propagated in Monitor.c. |
|
|
|
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com> |
|
Signed-off-by: Jes Sorensen <jsorensen@fb.com> |
|
--- |
|
Monitor.c | 37 ++++++++++++++----------------------- |
|
1 file changed, 14 insertions(+), 23 deletions(-) |
|
|
|
diff --git a/Monitor.c b/Monitor.c |
|
index a5b11ae2..93f36ac0 100644 |
|
--- a/Monitor.c |
|
+++ b/Monitor.c |
|
@@ -33,8 +33,8 @@ |
|
#endif |
|
|
|
struct state { |
|
- char *devname; |
|
- char devnm[32]; /* to sync with mdstat info */ |
|
+ char devname[MD_NAME_MAX + sizeof("/dev/md/")]; /* length of "/dev/md/" + device name + terminating byte*/ |
|
+ char devnm[MD_NAME_MAX]; /* to sync with mdstat info */ |
|
unsigned int utime; |
|
int err; |
|
char *spare_group; |
|
@@ -45,9 +45,9 @@ struct state { |
|
int devstate[MAX_DISKS]; |
|
dev_t devid[MAX_DISKS]; |
|
int percent; |
|
- char parent_devnm[32]; /* For subarray, devnm of parent. |
|
- * For others, "" |
|
- */ |
|
+ char parent_devnm[MD_NAME_MAX]; /* For subarray, devnm of parent. |
|
+ * For others, "" |
|
+ */ |
|
struct supertype *metadata; |
|
struct state *subarray;/* for a container it is a link to first subarray |
|
* for a subarray it is a link to next subarray |
|
@@ -187,15 +187,8 @@ int Monitor(struct mddev_dev *devlist, |
|
continue; |
|
|
|
st = xcalloc(1, sizeof *st); |
|
- if (mdlist->devname[0] == '/') |
|
- st->devname = xstrdup(mdlist->devname); |
|
- else { |
|
- /* length of "/dev/md/" + device name + terminating byte */ |
|
- size_t _len = sizeof("/dev/md/") + strnlen(mdlist->devname, PATH_MAX); |
|
- |
|
- st->devname = xcalloc(_len, sizeof(char)); |
|
- snprintf(st->devname, _len, "/dev/md/%s", mdlist->devname); |
|
- } |
|
+ snprintf(st->devname, MD_NAME_MAX + sizeof("/dev/md/"), |
|
+ "/dev/md/%s", basename(mdlist->devname)); |
|
if (!is_mddev(mdlist->devname)) |
|
return 1; |
|
st->next = statelist; |
|
@@ -218,7 +211,7 @@ int Monitor(struct mddev_dev *devlist, |
|
|
|
st = xcalloc(1, sizeof *st); |
|
mdlist = conf_get_ident(dv->devname); |
|
- st->devname = xstrdup(dv->devname); |
|
+ snprintf(st->devname, MD_NAME_MAX + sizeof("/dev/md/"), "%s", dv->devname); |
|
st->next = statelist; |
|
st->devnm[0] = 0; |
|
st->percent = RESYNC_UNKNOWN; |
|
@@ -301,7 +294,6 @@ int Monitor(struct mddev_dev *devlist, |
|
for (stp = &statelist; (st = *stp) != NULL; ) { |
|
if (st->from_auto && st->err > 5) { |
|
*stp = st->next; |
|
- free(st->devname); |
|
free(st->spare_group); |
|
free(st); |
|
} else |
|
@@ -554,7 +546,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, |
|
goto disappeared; |
|
|
|
if (st->devnm[0] == 0) |
|
- strcpy(st->devnm, fd2devnm(fd)); |
|
+ snprintf(st->devnm, MD_NAME_MAX, "%s", fd2devnm(fd)); |
|
|
|
for (mse2 = mdstat; mse2; mse2 = mse2->next) |
|
if (strcmp(mse2->devnm, st->devnm) == 0) { |
|
@@ -684,7 +676,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, |
|
strncmp(mse->metadata_version, "external:", 9) == 0 && |
|
is_subarray(mse->metadata_version+9)) { |
|
char *sl; |
|
- strcpy(st->parent_devnm, mse->metadata_version + 10); |
|
+ snprintf(st->parent_devnm, MD_NAME_MAX, "%s", mse->metadata_version + 10); |
|
sl = strchr(st->parent_devnm, '/'); |
|
if (sl) |
|
*sl = 0; |
|
@@ -772,14 +764,13 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist, |
|
continue; |
|
} |
|
|
|
- st->devname = xstrdup(name); |
|
+ snprintf(st->devname, MD_NAME_MAX + sizeof("/dev/md/"), "%s", name); |
|
if ((fd = open(st->devname, O_RDONLY)) < 0 || |
|
md_get_array_info(fd, &array) < 0) { |
|
/* no such array */ |
|
if (fd >= 0) |
|
close(fd); |
|
put_md_name(st->devname); |
|
- free(st->devname); |
|
if (st->metadata) { |
|
st->metadata->ss->free_super(st->metadata); |
|
free(st->metadata); |
|
@@ -791,7 +782,7 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist, |
|
st->next = *statelist; |
|
st->err = 1; |
|
st->from_auto = 1; |
|
- strcpy(st->devnm, mse->devnm); |
|
+ snprintf(st->devnm, MD_NAME_MAX, "%s", mse->devnm); |
|
st->percent = RESYNC_UNKNOWN; |
|
st->expected_spares = -1; |
|
if (mse->metadata_version && |
|
@@ -799,8 +790,8 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist, |
|
"external:", 9) == 0 && |
|
is_subarray(mse->metadata_version+9)) { |
|
char *sl; |
|
- strcpy(st->parent_devnm, |
|
- mse->metadata_version+10); |
|
+ snprintf(st->parent_devnm, MD_NAME_MAX, |
|
+ "%s", mse->metadata_version + 10); |
|
sl = strchr(st->parent_devnm, '/'); |
|
*sl = 0; |
|
} else |
|
-- |
|
2.31.1 |
|
|
|
|