summaryrefslogtreecommitdiff
path: root/mdmon.c
diff options
context:
space:
mode:
authorMateusz Kusiak <mateusz.kusiak@intel.com>2023-01-02 09:46:21 +0100
committerJes Sorensen <jes@trained-monkey.org>2023-01-04 10:25:56 -0500
commit9b429fc0a4ffd7028b3b336589d38e32fb9045dc (patch)
treee7e684de086b3bfbdd2afca2f69b05a9b598c11e /mdmon.c
parent3a87fa67112dc2c2c3664aeecd0b49cb4b6ceaa9 (diff)
downloadmdadm-9b429fc0a4ffd7028b3b336589d38e32fb9045dc.tar.gz
mdmon: fix segfault
Mdmon crashes if stat2devnm returns null. Use open_mddev to check if device is mddevice and get name using fd2devnm. Refactor container name handling. Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com> Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
Diffstat (limited to 'mdmon.c')
-rw-r--r--mdmon.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/mdmon.c b/mdmon.c
index e9d035e..ecf52dc 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -363,14 +363,14 @@ int main(int argc, char *argv[])
}
if (all == 0 && container_name == NULL) {
- if (argv[optind])
- container_name = argv[optind];
+ if (argv[optind]) {
+ container_name = get_md_name(argv[optind]);
+ if (!container_name)
+ container_name = argv[optind];
+ }
}
- if (container_name == NULL)
- usage();
-
- if (argc - optind > 1)
+ if (container_name == NULL || argc - optind > 1)
usage();
if (strcmp(container_name, "/proc/mdstat") == 0)
@@ -402,21 +402,19 @@ int main(int argc, char *argv[])
free_mdstat(mdstat);
return status;
- } else if (strncmp(container_name, "md", 2) == 0) {
- int id = devnm2devid(container_name);
- if (id)
- devnm = container_name;
} else {
- struct stat st;
+ int mdfd = open_mddev(container_name, 1);
- if (stat(container_name, &st) == 0)
- devnm = xstrdup(stat2devnm(&st));
+ if (mdfd < 0)
+ return 1;
+ devnm = fd2devnm(mdfd);
+ close(mdfd);
}
if (!devnm) {
pr_err("%s is not a valid md device name\n",
container_name);
- exit(1);
+ return 1;
}
return mdmon(devnm, dofork && do_fork(), takeover);
}