From e752251ff0c60f474bd543ff7a459fed3f09726a Mon Sep 17 00:00:00 2001 From: fandeyuan Date: Mon, 29 Jul 2024 15:31:33 +0800 Subject: [PATCH] mdmon: fix segfault --- 0026-mdmon-fix-segfault.patch | 86 +++++++++++++++++++++++++++++++++++ mdadm.spec | 6 ++- 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 0026-mdmon-fix-segfault.patch diff --git a/0026-mdmon-fix-segfault.patch b/0026-mdmon-fix-segfault.patch new file mode 100644 index 0000000..e9c5d73 --- /dev/null +++ b/0026-mdmon-fix-segfault.patch @@ -0,0 +1,86 @@ +From 9b429fc0a4ffd7028b3b336589d38e32fb9045dc Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:46:21 +0100 +Subject: [PATCH 77/83] 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 +Signed-off-by: Jes Sorensen +--- + Makefile | 2 +- + mdmon.c | 26 ++++++++++++-------------- + 2 files changed, 13 insertions(+), 15 deletions(-) + +diff --git a/Makefile b/Makefile +index ee5bdad..4046859 100644 +--- a/Makefile ++++ b/Makefile +@@ -160,7 +160,7 @@ SRCS = $(patsubst %.o,%.c,$(OBJS)) + + INCL = mdadm.h part.h bitmap.h + +-MON_OBJS = mdmon.o monitor.o managemon.o uuid.o util.o maps.o mdstat.o sysfs.o \ ++MON_OBJS = mdmon.o monitor.o managemon.o uuid.o util.o maps.o mdstat.o sysfs.o config.o mapfile.o mdopen.o\ + policy.o lib.o \ + Kill.o sg_io.o dlink.o ReadMe.o super-intel.o \ + super-mbr.o super-gpt.o \ +diff --git a/mdmon.c b/mdmon.c +index c71e62c..75d67f2 100644 +--- a/mdmon.c ++++ b/mdmon.c +@@ -341,14 +341,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 == NULL) ++ 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) +@@ -377,21 +377,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); + } +-- +2.33.0 + diff --git a/mdadm.spec b/mdadm.spec index c157c38..8667ff3 100644 --- a/mdadm.spec +++ b/mdadm.spec @@ -1,6 +1,6 @@ Name: mdadm Version: 4.2 -Release: 14 +Release: 15 Summary: The software RAID arrays user manage tools License: GPLv2+ URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/ @@ -35,6 +35,7 @@ Patch22: 0022-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch Patch23: 0023-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch Patch24: 0024-mdadm-util.c-fix-coverity-issues.patch Patch25: 0025-mdadm-sysfs.c-fix-coverity-issues.patch +Patch26: 0026-mdmon-fix-segfault.patch BuildRequires: systemd gcc binutils libudev-devel Requires(post): systemd coreutils @@ -100,6 +101,9 @@ install -d -m 710 %{buildroot}/var/run/mdadm/ %{_mandir}/man*/* %changelog +* Mon Sep 2 2024 Deyuan Fan - 4.2-15 +- mdmon: fix segfault + * Wed Aug 28 2024 wuguanghao - 4.2-14 - backport bugfix patches from community -- Gitee