From: Coly Li <colyli@suse.de>
To: Kinga Tanska <kinga.tanska@intel.com>
Cc: jes@trained-monkey.org, linux-raid@vger.kernel.org
Subject: Re: [PATCH] Monitor: use devname as char array instead of pointer
Date: Sat, 19 Mar 2022 23:42:51 +0800 [thread overview]
Message-ID: <ade5153b-d07a-9c26-5c8e-12b8356f61b4@suse.de> (raw)
In-Reply-To: <20220209085628.11418-1-kinga.tanska@intel.com>
On 2/9/22 4:56 PM, Kinga Tanska wrote:
> Device name wasn't filled properly due to incorrect use of strcpy.
Could you point out the specific location for improper strcpy?
> Instead pointer, devname with fixed size is used and safer string
> functions are propagated.
>
> Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
> ---
> Monitor.c | 30 +++++++++++-------------------
> 1 file changed, 11 insertions(+), 19 deletions(-)
>
> diff --git a/Monitor.c b/Monitor.c
> index 30c031a2..d02344ec 100644
> --- a/Monitor.c
> +++ b/Monitor.c
> @@ -34,8 +34,8 @@
> #endif
>
> struct state {
> - char *devname;
> - char devnm[32]; /* to sync with mdstat info */
> + char devname[MD_NAME_MAX + 8];
> + char devnm[MD_NAME_MAX]; /* to sync with mdstat info */
> unsigned int utime;
> int err;
> char *spare_group;
> @@ -46,7 +46,7 @@ struct state {
> int devstate[MAX_DISKS];
> dev_t devid[MAX_DISKS];
> int percent;
> - char parent_devnm[32]; /* For subarray, devnm of parent.
> + char parent_devnm[MD_NAME_MAX]; /* For subarray, devnm of parent.
> * For others, ""
> */
> struct supertype *metadata;
> @@ -184,13 +184,7 @@ int Monitor(struct mddev_dev *devlist,
> if (strcasecmp(mdlist->devname, "<ignore>") == 0)
> continue;
> st = xcalloc(1, sizeof *st);
> - if (mdlist->devname[0] == '/')
> - st->devname = xstrdup(mdlist->devname);
> - else {
> - st->devname = xmalloc(8+strlen(mdlist->devname)+1);
> - strcpy(strcpy(st->devname, "/dev/md/"),
> - mdlist->devname);
> - }
> + snprintf(st->devname, MD_NAME_MAX + 8, "/dev/md/%s", basename(mdlist->devname));
I feel the above change is incorrect, the tailing '\0' of the string
might be cut by your change.
> st->next = statelist;
> st->devnm[0] = 0;
> st->percent = RESYNC_UNKNOWN;
> @@ -206,7 +200,7 @@ int Monitor(struct mddev_dev *devlist,
> for (dv = devlist; dv; dv = dv->next) {
> struct state *st = xcalloc(1, sizeof *st);
> mdlist = conf_get_ident(dv->devname);
> - st->devname = xstrdup(dv->devname);
> + snprintf(st->devname, MD_NAME_MAX + 8, "%s", dv->devname);
> st->next = statelist;
> st->devnm[0] = 0;
> st->percent = RESYNC_UNKNOWN;
> @@ -289,7 +283,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
> @@ -540,7 +533,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) {
> @@ -670,7 +663,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;
> @@ -758,14 +751,13 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist,
> continue;
> }
>
> - st->devname = xstrdup(name);
> + snprintf(st->devname, MD_NAME_MAX + 8, "%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);
> @@ -777,7 +769,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 &&
> @@ -785,8 +777,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
With your change, the tailing '\0' for dev name might be cut. Could you
please check whether it may introduce potential memleak ?
Thanks.
Coly Li
next prev parent reply other threads:[~2022-03-19 15:43 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-09 8:56 [PATCH] Monitor: use devname as char array instead of pointer Kinga Tanska
2022-03-19 15:42 ` Coly Li [this message]
2022-04-04 13:54 ` Jes Sorensen
2022-04-05 12:21 ` Tanska, Kinga
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ade5153b-d07a-9c26-5c8e-12b8356f61b4@suse.de \
--to=colyli@suse.de \
--cc=jes@trained-monkey.org \
--cc=kinga.tanska@intel.com \
--cc=linux-raid@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).