* [PATCH V3 00/14] mdadm: fix coverity issues
@ 2024-07-22 8:17 Xiao Ni
2024-07-22 8:17 ` [PATCH 1/3] mdadm/Grow: fix coverity issue CHECKED_RETURN Xiao Ni
` (13 more replies)
0 siblings, 14 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
V2: replace close with close_fd and use is_fd_valid
V3: Fix errors reported by checkpatch
Xiao Ni (14):
mdadm/Grow: fix coverity issue CHECKED_RETURN
mdadm/Grow: fix coverity issue RESOURCE_LEAK
mdadm/Grow: fix coverity issue STRING_OVERFLOW
mdadm/Incremental: fix coverity issues.
mdadm/mdmon: fix coverity issue CHECKED_RETURN
mdadm/mdmon: fix coverity issue RESOURCE_LEAK
mdadm/mdopen: fix coverity issue CHECKED_RETURN
mdadm/mdopen: fix coverity issue STRING_OVERFLOW
mdadm/mdstat: fix coverity issue CHECKED_RETURN
mdadm/super0: fix coverity issue CHECKED_RETURN and EVALUATION_ORDER
mdadm/super1: fix coverity issue CHECKED_RETURN
mdadm/super1: fix coverity issue DEADCODE
mdadm/super1: fix coverity issue EVALUATION_ORDER
mdadm/super1: fix coverity issue RESOURCE_LEAK
Grow.c | 92 +++++++++++++++++++++++++++++++++++++++++----------
Incremental.c | 20 +++++------
mdmon.c | 17 +++++++---
mdopen.c | 8 +++--
mdstat.c | 12 +++++--
super0.c | 10 ++++--
super1.c | 32 +++++++++++++-----
7 files changed, 142 insertions(+), 49 deletions(-)
--
2.41.0
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/3] mdadm/Grow: fix coverity issue CHECKED_RETURN
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 2/3] mdadm/Grow: fix coverity issue RESOURCE_LEAK Xiao Ni
` (12 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
It needs to check return value when functions have return value.
Signed-off-by: Xiao Ni <xni@redhat.com>
---
Grow.c | 43 ++++++++++++++++++++++++++++++++++++-------
1 file changed, 36 insertions(+), 7 deletions(-)
diff --git a/Grow.c b/Grow.c
index b135930d05b8..7ae967bda067 100644
--- a/Grow.c
+++ b/Grow.c
@@ -3261,7 +3261,12 @@ static int reshape_array(char *container, int fd, char *devname,
/* This is a spare that wants to
* be part of the array.
*/
- add_disk(fd, st, info2, d);
+ if (add_disk(fd, st, info2, d) < 0) {
+ pr_err("Can not add disk %s\n",
+ d->sys_name);
+ free(info2);
+ goto release;
+ }
}
}
sysfs_free(info2);
@@ -4413,7 +4418,10 @@ static void validate(int afd, int bfd, unsigned long long offset)
*/
if (afd < 0)
return;
- lseek64(bfd, offset - 4096, 0);
+ if (lseek64(bfd, offset - 4096, 0) < 0) {
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
+ return;
+ }
if (read(bfd, &bsb2, 512) != 512)
fail("cannot read bsb");
if (bsb2.sb_csum != bsb_csum((char*)&bsb2,
@@ -4444,12 +4452,19 @@ static void validate(int afd, int bfd, unsigned long long offset)
}
}
- lseek64(bfd, offset, 0);
+ if (lseek64(bfd, offset, 0) < 0) {
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
+ goto out;
+ }
if ((unsigned long long)read(bfd, bbuf, len) != len) {
//printf("len %llu\n", len);
fail("read first backup failed");
}
- lseek64(afd, __le64_to_cpu(bsb2.arraystart)*512, 0);
+
+ if (lseek64(afd, __le64_to_cpu(bsb2.arraystart)*512, 0) < 0) {
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
+ goto out;
+ }
if ((unsigned long long)read(afd, abuf, len) != len)
fail("read first from array failed");
if (memcmp(bbuf, abuf, len) != 0)
@@ -4466,15 +4481,25 @@ static void validate(int afd, int bfd, unsigned long long offset)
bbuf = xmalloc(abuflen);
}
- lseek64(bfd, offset+__le64_to_cpu(bsb2.devstart2)*512, 0);
+ if (lseek64(bfd, offset+__le64_to_cpu(bsb2.devstart2)*512, 0) < 0) {
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
+ goto out;
+ }
if ((unsigned long long)read(bfd, bbuf, len) != len)
fail("read second backup failed");
- lseek64(afd, __le64_to_cpu(bsb2.arraystart2)*512, 0);
+ if (lseek64(afd, __le64_to_cpu(bsb2.arraystart2)*512, 0) < 0) {
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
+ goto out;
+ }
if ((unsigned long long)read(afd, abuf, len) != len)
fail("read second from array failed");
if (memcmp(bbuf, abuf, len) != 0)
fail("data2 compare failed");
}
+out:
+ free(abuf);
+ free(bbuf);
+ return;
}
int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
@@ -5033,7 +5058,11 @@ int Grow_continue_command(char *devname, int fd, struct context *c)
goto Grow_continue_command_exit;
}
content = &array;
- sysfs_init(content, fd, NULL);
+ if (sysfs_init(content, fd, NULL) < 0) {
+ pr_err("sysfs_init fails\n");
+ ret_val = 1;
+ goto Grow_continue_command_exit;
+ }
/* Need to load a superblock.
* FIXME we should really get what we need from
* sysfs
--
2.32.0 (Apple Git-132)
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/3] mdadm/Grow: fix coverity issue RESOURCE_LEAK
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
2024-07-22 8:17 ` [PATCH 1/3] mdadm/Grow: fix coverity issue CHECKED_RETURN Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 3/3] mdadm/Grow: fix coverity issue STRING_OVERFLOW Xiao Ni
` (11 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
Fix some resource leak problems.
Signed-off-by: Xiao Ni <xni@redhat.com>
---
Grow.c | 47 ++++++++++++++++++++++++++++++++++++-----------
1 file changed, 36 insertions(+), 11 deletions(-)
diff --git a/Grow.c b/Grow.c
index 7ae967bda067..e18f1db00a57 100644
--- a/Grow.c
+++ b/Grow.c
@@ -530,8 +530,10 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
pr_err("Cannot add bitmap while array is resyncing or reshaping etc.\n");
pr_err("Cannot set bitmap file for %s: %s\n",
devname, strerror(err));
+ close_fd(&bitmap_fd);
return 1;
}
+ close_fd(&bitmap_fd);
}
return 0;
@@ -3083,6 +3085,7 @@ static int reshape_array(char *container, int fd, char *devname,
int done;
struct mdinfo *sra = NULL;
char buf[SYSFS_MAX_BUF_SIZE];
+ bool located_backup = false;
/* when reshaping a RAID0, the component_size might be zero.
* So try to fix that up.
@@ -3165,8 +3168,10 @@ static int reshape_array(char *container, int fd, char *devname,
goto release;
}
- if (!backup_file)
+ if (!backup_file) {
backup_file = locate_backup(sra->sys_name);
+ located_backup = true;
+ }
goto started;
}
@@ -3612,15 +3617,13 @@ started:
mdstat_wait(30 - (delayed-1) * 25);
} while (delayed);
mdstat_close();
- if (check_env("MDADM_GROW_VERIFY"))
- fd = open(devname, O_RDONLY | O_DIRECT);
- else
- fd = -1;
mlockall(MCL_FUTURE);
if (signal_s(SIGTERM, catch_term) == SIG_ERR)
goto release;
+ if (check_env("MDADM_GROW_VERIFY"))
+ fd = open(devname, O_RDONLY | O_DIRECT);
if (st->ss->external) {
/* metadata handler takes it from here */
done = st->ss->manage_reshape(
@@ -3632,6 +3635,8 @@ started:
fd, sra, &reshape, st, blocks, fdlist, offsets,
d - odisks, fdlist + odisks, offsets + odisks);
+ if (fd >= 0)
+ close_fd(&fd);
free(fdlist);
free(offsets);
@@ -3701,6 +3706,8 @@ out:
exit(0);
release:
+ if (located_backup)
+ free(backup_file);
free(fdlist);
free(offsets);
if (orig_level != UnSet && sra) {
@@ -3839,6 +3846,7 @@ int reshape_container(char *container, char *devname,
pr_err("Unable to initialize sysfs for %s\n",
mdstat->devnm);
rv = 1;
+ close_fd(&fd);
break;
}
@@ -4717,6 +4725,7 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
unsigned long long *offsets;
unsigned long long nstripe, ostripe;
int ndata, odata;
+ int fd, backup_fd = -1;
odata = info->array.raid_disks - info->delta_disks - 1;
if (info->array.level == 6)
@@ -4732,9 +4741,18 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
* been used
*/
old_disks = cnt;
+
+ if (backup_file) {
+ backup_fd = open(backup_file, O_RDONLY);
+ if (!is_fd_valid(backup_fd)) {
+ pr_err("Can't open backup file %s : %s\n",
+ backup_file, strerror(errno));
+ return -EINVAL;
+ }
+ }
+
for (i=old_disks-(backup_file?1:0); i<cnt; i++) {
struct mdinfo dinfo;
- int fd;
int bsbsize;
char *devname, namebuf[20];
unsigned long long lo, hi;
@@ -4747,12 +4765,9 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
* else restore data and update all superblocks
*/
if (i == old_disks-1) {
- fd = open(backup_file, O_RDONLY);
- if (fd<0) {
- pr_err("backup file %s inaccessible: %s\n",
- backup_file, strerror(errno));
+ if (!is_fd_valid(backup_fd))
continue;
- }
+ fd = backup_fd;
devname = backup_file;
} else {
fd = fdlist[i];
@@ -4907,6 +4922,8 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
pr_err("Error restoring backup from %s\n",
devname);
free(offsets);
+ if (is_fd_valid(backup_fd))
+ close_fd(&backup_fd);
return 1;
}
@@ -4923,6 +4940,8 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
pr_err("Error restoring second backup from %s\n",
devname);
free(offsets);
+ if (is_fd_valid(backup_fd))
+ close_fd(&backup_fd);
return 1;
}
@@ -4984,8 +5003,14 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
st->ss->store_super(st, fdlist[j]);
st->ss->free_super(st);
}
+ if (is_fd_valid(backup_fd))
+ close_fd(&backup_fd);
return 0;
}
+
+ if (is_fd_valid(backup_fd))
+ close_fd(&backup_fd);
+
/* Didn't find any backup data, try to see if any
* was needed.
*/
--
2.32.0 (Apple Git-132)
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/3] mdadm/Grow: fix coverity issue STRING_OVERFLOW
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
2024-07-22 8:17 ` [PATCH 1/3] mdadm/Grow: fix coverity issue CHECKED_RETURN Xiao Ni
2024-07-22 8:17 ` [PATCH 2/3] mdadm/Grow: fix coverity issue RESOURCE_LEAK Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 04/14] mdadm/Incremental: fix coverity issues Xiao Ni
` (10 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
Fix string overflow problems in Grow.c
Signed-off-by: Xiao Ni <xni@redhat.com>
---
Grow.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Grow.c b/Grow.c
index e18f1db00a57..953251561cf8 100644
--- a/Grow.c
+++ b/Grow.c
@@ -1694,6 +1694,8 @@ char *analyse_change(char *devname, struct mdinfo *info, struct reshape *re)
/* Current RAID6 layout has a RAID5
* equivalent - good
*/
+ if (strlen(ls) > (40-1))
+ pr_err("%s length is bigger than destination", ls);
strcat(strcpy(layout, ls), "-6");
l = map_name(r6layout, layout);
if (l == UnSet)
--
2.32.0 (Apple Git-132)
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 04/14] mdadm/Incremental: fix coverity issues.
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (2 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 3/3] mdadm/Grow: fix coverity issue STRING_OVERFLOW Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 05/14] mdadm/mdmon: fix coverity issue CHECKED_RETURN Xiao Ni
` (9 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
There are two issues PW.PARAMETER_HIDDEN and INTEGER_OVERFLOW
Signed-off-by: Xiao Ni <xni@redhat.com>
---
Incremental.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/Incremental.c b/Incremental.c
index 83db0712..508e2c7c 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -770,7 +770,7 @@ static int count_active(struct supertype *st, struct mdinfo *sra,
replcnt++;
st->ss->free_super(st);
}
- if (max_journal_events >= max_events - 1)
+ if (max_events > 0 && max_journal_events >= max_events - 1)
bestinfo->journal_clean = 1;
if (!avail)
@@ -1113,7 +1113,7 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
int fd = -1;
struct mdinfo info;
struct supertype *st2 = NULL;
- char *devname = NULL;
+ char *dev_name = NULL;
unsigned long long devsectors;
char *pathlist[2];
@@ -1142,14 +1142,14 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
domain_free(domlist);
domlist = NULL;
- if (asprintf(&devname, "/dev/disk/by-path/%s", de->d_name) != 1) {
- devname = NULL;
+ if (asprintf(&dev_name, "/dev/disk/by-path/%s", de->d_name) != 1) {
+ dev_name = NULL;
goto next;
}
- fd = open(devname, O_RDONLY);
+ fd = open(dev_name, O_RDONLY);
if (fd < 0)
goto next;
- if (get_dev_size(fd, devname, &devsectors) == 0)
+ if (get_dev_size(fd, dev_name, &devsectors) == 0)
goto next;
devsectors >>= 9;
@@ -1188,8 +1188,8 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
if (chosen == NULL || chosen_size < info.component_size) {
chosen_size = info.component_size;
free(chosen);
- chosen = devname;
- devname = NULL;
+ chosen = dev_name;
+ dev_name = NULL;
if (chosen_st) {
chosen_st->ss->free_super(chosen_st);
free(chosen_st);
@@ -1199,7 +1199,7 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
}
next:
- free(devname);
+ free(dev_name);
domain_free(domlist);
dev_policy_free(pol2);
if (st2)
@@ -1246,7 +1246,7 @@ static int is_bare(int dfd)
/* OK, first 4K appear blank, try the end. */
get_dev_size(dfd, NULL, &size);
- if (lseek(dfd, size-4096, SEEK_SET) < 0 ||
+ if ((size >= 4096 && lseek(dfd, size-4096, SEEK_SET) < 0) ||
read(dfd, buf, 4096) != 4096)
return 0;
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 05/14] mdadm/mdmon: fix coverity issue CHECKED_RETURN
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (3 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 04/14] mdadm/Incremental: fix coverity issues Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 06/14] mdadm/mdmon: fix coverity issue RESOURCE_LEAK Xiao Ni
` (8 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
It needs to check return values when functions have return value.
Signed-off-by: Xiao Ni <xni@redhat.com>
---
mdmon.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/mdmon.c b/mdmon.c
index 5fdb5cdb..b6fe302e 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -199,7 +199,8 @@ static void try_kill_monitor(pid_t pid, char *devname, int sock)
* clearing the non-blocking flag */
fl = fcntl(sock, F_GETFL, 0);
fl &= ~O_NONBLOCK;
- fcntl(sock, F_SETFL, fl);
+ if (fcntl(sock, F_SETFL, fl) < 0)
+ return;
n = read(sock, buf, 100);
/* If there is I/O going on it might took some time to get to
@@ -249,7 +250,10 @@ static int make_control_sock(char *devname)
listen(sfd, 10);
fl = fcntl(sfd, F_GETFL, 0);
fl |= O_NONBLOCK;
- fcntl(sfd, F_SETFL, fl);
+ if (fcntl(sfd, F_SETFL, fl) < 0) {
+ close_fd(&sfd);
+ return -1;
+ }
return sfd;
}
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 06/14] mdadm/mdmon: fix coverity issue RESOURCE_LEAK
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (4 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 05/14] mdadm/mdmon: fix coverity issue CHECKED_RETURN Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 07/14] mdadm/mdopen: fix coverity issue CHECKED_RETURN Xiao Ni
` (7 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
Fix resource leak problem in mdmon.c
Signed-off-by: Xiao Ni <xni@redhat.com>
---
mdmon.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/mdmon.c b/mdmon.c
index b6fe302e..a498c9bd 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -455,22 +455,25 @@ static int mdmon(char *devnm, int must_fork, int takeover)
if (must_fork) {
if (pipe(pfd) != 0) {
pr_err("failed to create pipe\n");
+ close_fd(&mdfd);
return 1;
}
switch(fork()) {
case -1:
pr_err("failed to fork: %s\n", strerror(errno));
+ close_fd(&mdfd);
return 1;
case 0: /* child */
- close(pfd[0]);
+ close_fd(&pfd[0]);
break;
default: /* parent */
- close(pfd[1]);
+ close_fd(&pfd[1]);
if (read(pfd[0], &status, sizeof(status)) != sizeof(status)) {
wait(&status);
status = WEXITSTATUS(status);
}
- close(pfd[0]);
+ close_fd(&pfd[0]);
+ close_fd(&mdfd);
return status;
}
} else
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 07/14] mdadm/mdopen: fix coverity issue CHECKED_RETURN
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (5 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 06/14] mdadm/mdmon: fix coverity issue RESOURCE_LEAK Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 08/14] mdadm/mdopen: fix coverity issue STRING_OVERFLOW Xiao Ni
` (6 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
It needs to check return values when functions return value.
Signed-off-by: Xiao Ni <xni@redhat.com>
---
mdopen.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/mdopen.c b/mdopen.c
index eaa59b59..c9fda131 100644
--- a/mdopen.c
+++ b/mdopen.c
@@ -406,7 +406,11 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
perror("chown");
if (chmod(devname, ci->mode))
perror("chmod");
- stat(devname, &stb);
+ if (stat(devname, &stb) < 0) {
+ pr_err("failed to stat %s\n",
+ devname);
+ return -1;
+ }
add_dev(devname, &stb, 0, NULL);
}
if (use_mdp == 1)
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 08/14] mdadm/mdopen: fix coverity issue STRING_OVERFLOW
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (6 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 07/14] mdadm/mdopen: fix coverity issue CHECKED_RETURN Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 09/14] mdadm/mdstat: fix coverity issue CHECKED_RETURN Xiao Ni
` (5 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
Fix string overflow problems in mdopen.c
Signed-off-by: Xiao Ni <xni@redhat.com>
---
mdopen.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mdopen.c b/mdopen.c
index c9fda131..e49defb6 100644
--- a/mdopen.c
+++ b/mdopen.c
@@ -376,7 +376,7 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
sprintf(devname, "/dev/%s", devnm);
- if (dev && dev[0] == '/')
+ if (dev && dev[0] == '/' && strlen(dev) < 400)
strcpy(chosen, dev);
else if (cname[0] == 0)
strcpy(chosen, devname);
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 09/14] mdadm/mdstat: fix coverity issue CHECKED_RETURN
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (7 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 08/14] mdadm/mdopen: fix coverity issue STRING_OVERFLOW Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 10/14] mdadm/super0: fix coverity issue CHECKED_RETURN and EVALUATION_ORDER Xiao Ni
` (4 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
It needs to check return values when functions return value.
Signed-off-by: Xiao Ni <xni@redhat.com>
---
mdstat.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/mdstat.c b/mdstat.c
index e233f094..930d59ee 100644
--- a/mdstat.c
+++ b/mdstat.c
@@ -146,8 +146,11 @@ struct mdstat_ent *mdstat_read(int hold, int start)
f = fopen("/proc/mdstat", "r");
if (f == NULL)
return NULL;
- else
- fcntl(fileno(f), F_SETFD, FD_CLOEXEC);
+
+ if (fcntl(fileno(f), F_SETFD, FD_CLOEXEC) < 0) {
+ fclose(f);
+ return NULL;
+ }
all = NULL;
end = &all;
@@ -281,7 +284,10 @@ struct mdstat_ent *mdstat_read(int hold, int start)
}
if (hold && mdstat_fd == -1) {
mdstat_fd = dup(fileno(f));
- fcntl(mdstat_fd, F_SETFD, FD_CLOEXEC);
+ if (fcntl(mdstat_fd, F_SETFD, FD_CLOEXEC) < 0) {
+ fclose(f);
+ return NULL;
+ }
}
fclose(f);
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 10/14] mdadm/super0: fix coverity issue CHECKED_RETURN and EVALUATION_ORDER
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (8 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 09/14] mdadm/mdstat: fix coverity issue CHECKED_RETURN Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 11/14] mdadm/super1: fix coverity issue CHECKED_RETURN Xiao Ni
` (3 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
Fix coverity problems in super0. It needs to check return value when
functions return value. And fix EVALUATION_ORDER problems in super0.c
Signed-off-by: Xiao Ni <xni@redhat.com>
---
super0.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/super0.c b/super0.c
index 9b8a1bd6..6f43b167 100644
--- a/super0.c
+++ b/super0.c
@@ -83,6 +83,9 @@ static void examine_super0(struct supertype *st, char *homehost)
int d;
int delta_extra = 0;
char *c;
+ unsigned long expected_csum = 0;
+
+ expected_csum = calc_sb0_csum(sb);
printf(" Magic : %08x\n", sb->md_magic);
printf(" Version : %d.%02d.%02d\n",
@@ -187,11 +190,11 @@ static void examine_super0(struct supertype *st, char *homehost)
printf("Working Devices : %d\n", sb->working_disks);
printf(" Failed Devices : %d\n", sb->failed_disks);
printf(" Spare Devices : %d\n", sb->spare_disks);
- if (calc_sb0_csum(sb) == sb->sb_csum)
+ if (expected_csum == sb->sb_csum)
printf(" Checksum : %x - correct\n", sb->sb_csum);
else
printf(" Checksum : %x - expected %lx\n",
- sb->sb_csum, calc_sb0_csum(sb));
+ sb->sb_csum, expected_csum);
printf(" Events : %llu\n",
((unsigned long long)sb->events_hi << 32) + sb->events_lo);
printf("\n");
@@ -1212,7 +1215,8 @@ static int locate_bitmap0(struct supertype *st, int fd, int node_num)
offset += MD_SB_BYTES;
- lseek64(fd, offset, 0);
+ if (lseek64(fd, offset, 0) < 0)
+ return -1;
return 0;
}
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 11/14] mdadm/super1: fix coverity issue CHECKED_RETURN
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (9 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 10/14] mdadm/super0: fix coverity issue CHECKED_RETURN and EVALUATION_ORDER Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 12/14] mdadm/super1: fix coverity issue DEADCODE Xiao Ni
` (2 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
It needs to check return value when functions return value.
Signed-off-by: Xiao Ni <xni@redhat.com>
---
super1.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/super1.c b/super1.c
index 81d29a65..4e4c7bfd 100644
--- a/super1.c
+++ b/super1.c
@@ -260,7 +260,10 @@ static int aread(struct align_fd *afd, void *buf, int len)
n = read(afd->fd, b, iosize);
if (n <= 0)
return n;
- lseek(afd->fd, len - n, 1);
+ if (lseek(afd->fd, len - n, 1) < 0) {
+ pr_err("lseek fails\n");
+ return -1;
+ }
if (n > len)
n = len;
memcpy(buf, b, n);
@@ -294,14 +297,20 @@ static int awrite(struct align_fd *afd, void *buf, int len)
n = read(afd->fd, b, iosize);
if (n <= 0)
return n;
- lseek(afd->fd, -n, 1);
+ if (lseek(afd->fd, -n, 1) < 0) {
+ pr_err("lseek fails\n");
+ return -1;
+ }
}
memcpy(b, buf, len);
n = write(afd->fd, b, iosize);
if (n <= 0)
return n;
- lseek(afd->fd, len - n, 1);
+ if (lseek(afd->fd, len - n, 1) < 0) {
+ pr_err("lseek fails\n");
+ return -1;
+ }
return len;
}
@@ -2667,7 +2676,10 @@ static int locate_bitmap1(struct supertype *st, int fd, int node_num)
}
if (mustfree)
free(sb);
- lseek64(fd, offset<<9, 0);
+ if (lseek64(fd, offset<<9, 0) < 0) {
+ pr_err("lseek fails\n");
+ ret = -1;
+ }
return ret;
}
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 12/14] mdadm/super1: fix coverity issue DEADCODE
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (10 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 11/14] mdadm/super1: fix coverity issue CHECKED_RETURN Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 13/14] mdadm/super1: fix coverity issue EVALUATION_ORDER Xiao Ni
2024-07-22 8:17 ` [PATCH 14/14] mdadm/super1: fix coverity issue RESOURCE_LEAK Xiao Ni
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
optimal_space is at most 2046. So space can't be larger than UINT16_MAX.
Signed-off-by: Xiao Ni <xni@redhat.com>
---
super1.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/super1.c b/super1.c
index 4e4c7bfd..24bc1026 100644
--- a/super1.c
+++ b/super1.c
@@ -1466,8 +1466,6 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
__le32_to_cpu(sb->chunksize));
if (space > optimal_space)
space = optimal_space;
- if (space > UINT16_MAX)
- space = UINT16_MAX;
}
sb->ppl.offset = __cpu_to_le16(offset);
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 13/14] mdadm/super1: fix coverity issue EVALUATION_ORDER
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (11 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 12/14] mdadm/super1: fix coverity issue DEADCODE Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
2024-07-22 8:17 ` [PATCH 14/14] mdadm/super1: fix coverity issue RESOURCE_LEAK Xiao Ni
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
Fix evaluation order problems in super1.c
Signed-off-by: Xiao Ni <xni@redhat.com>
---
super1.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/super1.c b/super1.c
index 24bc1026..243eeb1a 100644
--- a/super1.c
+++ b/super1.c
@@ -340,6 +340,9 @@ static void examine_super1(struct supertype *st, char *homehost)
unsigned long long sb_offset;
struct mdinfo info;
int inconsistent = 0;
+ unsigned int expected_csum = 0;
+
+ expected_csum = calc_sb_1_csum(sb);
printf(" Magic : %08x\n", __le32_to_cpu(sb->magic));
printf(" Version : 1");
@@ -507,13 +510,13 @@ static void examine_super1(struct supertype *st, char *homehost)
printf("\n");
}
- if (calc_sb_1_csum(sb) == sb->sb_csum)
+ if (expected_csum == sb->sb_csum)
printf(" Checksum : %x - correct\n",
__le32_to_cpu(sb->sb_csum));
else
printf(" Checksum : %x - expected %x\n",
__le32_to_cpu(sb->sb_csum),
- __le32_to_cpu(calc_sb_1_csum(sb)));
+ __le32_to_cpu(expected_csum));
printf(" Events : %llu\n",
(unsigned long long)__le64_to_cpu(sb->events));
printf("\n");
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 14/14] mdadm/super1: fix coverity issue RESOURCE_LEAK
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
` (12 preceding siblings ...)
2024-07-22 8:17 ` [PATCH 13/14] mdadm/super1: fix coverity issue EVALUATION_ORDER Xiao Ni
@ 2024-07-22 8:17 ` Xiao Ni
13 siblings, 0 replies; 15+ messages in thread
From: Xiao Ni @ 2024-07-22 8:17 UTC (permalink / raw)
To: mariusz.tkaczyk; +Cc: ncroxon, linux-raid
Fix resource leak problems in super1.c
Signed-off-by: Xiao Ni <xni@redhat.com>
---
super1.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/super1.c b/super1.c
index 243eeb1a..9c9c7dd1 100644
--- a/super1.c
+++ b/super1.c
@@ -923,10 +923,12 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
offset <<= 9;
if (lseek64(fd, offset, 0) < 0) {
pr_err("Cannot seek to bad-blocks list\n");
+ free(bbl);
return 1;
}
if (read(fd, bbl, size) != size) {
pr_err("Cannot read bad-blocks list\n");
+ free(bbl);
return 1;
}
/* 64bits per entry. 10 bits is block-count, 54 bits is block
@@ -947,6 +949,7 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
printf("%20llu for %d sectors\n", sector, count);
}
+ free(bbl);
return 0;
}
--
2.41.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
end of thread, other threads:[~2024-07-22 8:18 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-22 8:17 [PATCH V3 00/14] mdadm: fix coverity issues Xiao Ni
2024-07-22 8:17 ` [PATCH 1/3] mdadm/Grow: fix coverity issue CHECKED_RETURN Xiao Ni
2024-07-22 8:17 ` [PATCH 2/3] mdadm/Grow: fix coverity issue RESOURCE_LEAK Xiao Ni
2024-07-22 8:17 ` [PATCH 3/3] mdadm/Grow: fix coverity issue STRING_OVERFLOW Xiao Ni
2024-07-22 8:17 ` [PATCH 04/14] mdadm/Incremental: fix coverity issues Xiao Ni
2024-07-22 8:17 ` [PATCH 05/14] mdadm/mdmon: fix coverity issue CHECKED_RETURN Xiao Ni
2024-07-22 8:17 ` [PATCH 06/14] mdadm/mdmon: fix coverity issue RESOURCE_LEAK Xiao Ni
2024-07-22 8:17 ` [PATCH 07/14] mdadm/mdopen: fix coverity issue CHECKED_RETURN Xiao Ni
2024-07-22 8:17 ` [PATCH 08/14] mdadm/mdopen: fix coverity issue STRING_OVERFLOW Xiao Ni
2024-07-22 8:17 ` [PATCH 09/14] mdadm/mdstat: fix coverity issue CHECKED_RETURN Xiao Ni
2024-07-22 8:17 ` [PATCH 10/14] mdadm/super0: fix coverity issue CHECKED_RETURN and EVALUATION_ORDER Xiao Ni
2024-07-22 8:17 ` [PATCH 11/14] mdadm/super1: fix coverity issue CHECKED_RETURN Xiao Ni
2024-07-22 8:17 ` [PATCH 12/14] mdadm/super1: fix coverity issue DEADCODE Xiao Ni
2024-07-22 8:17 ` [PATCH 13/14] mdadm/super1: fix coverity issue EVALUATION_ORDER Xiao Ni
2024-07-22 8:17 ` [PATCH 14/14] mdadm/super1: fix coverity issue RESOURCE_LEAK Xiao Ni
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).