Blame SOURCES/0016-Mdmonitor-Fix-segfault.patch

25786b
From e702f392959d1c2ad2089e595b52235ed97b4e18 Mon Sep 17 00:00:00 2001
25786b
From: Kinga Tanska <kinga.tanska@intel.com>
25786b
Date: Mon, 6 Jun 2022 12:32:12 +0200
91179e
Subject: [PATCH 16/83] Mdmonitor: Fix segfault
25786b
25786b
Mdadm with "--monitor" parameter requires md device
25786b
as an argument to be monitored. If given argument is
25786b
not a md device, error shall be returned. Previously
25786b
it was not checked and invalid argument caused
25786b
segmentation fault. This commit adds checking
25786b
that devices passed to mdmonitor are md devices.
25786b
25786b
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
25786b
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
25786b
---
25786b
 Monitor.c | 10 +++++++++-
25786b
 mdadm.h   |  1 +
25786b
 mdopen.c  | 17 +++++++++++++++++
25786b
 3 files changed, 27 insertions(+), 1 deletion(-)
25786b
25786b
diff --git a/Monitor.c b/Monitor.c
25786b
index c0ab5412..4e5802b5 100644
25786b
--- a/Monitor.c
25786b
+++ b/Monitor.c
25786b
@@ -182,6 +182,7 @@ int Monitor(struct mddev_dev *devlist,
25786b
 				continue;
25786b
 			if (strcasecmp(mdlist->devname, "<ignore>") == 0)
25786b
 				continue;
25786b
+
25786b
 			st = xcalloc(1, sizeof *st);
25786b
 			if (mdlist->devname[0] == '/')
25786b
 				st->devname = xstrdup(mdlist->devname);
25786b
@@ -190,6 +191,8 @@ int Monitor(struct mddev_dev *devlist,
25786b
 				strcpy(strcpy(st->devname, "/dev/md/"),
25786b
 				       mdlist->devname);
25786b
 			}
25786b
+			if (!is_mddev(mdlist->devname))
25786b
+				return 1;
25786b
 			st->next = statelist;
25786b
 			st->devnm[0] = 0;
25786b
 			st->percent = RESYNC_UNKNOWN;
25786b
@@ -203,7 +206,12 @@ int Monitor(struct mddev_dev *devlist,
25786b
 		struct mddev_dev *dv;
25786b
 
25786b
 		for (dv = devlist; dv; dv = dv->next) {
25786b
-			struct state *st = xcalloc(1, sizeof *st);
25786b
+			struct state *st;
25786b
+
25786b
+			if (!is_mddev(dv->devname))
25786b
+				return 1;
25786b
+
25786b
+			st = xcalloc(1, sizeof *st);
25786b
 			mdlist = conf_get_ident(dv->devname);
25786b
 			st->devname = xstrdup(dv->devname);
25786b
 			st->next = statelist;
25786b
diff --git a/mdadm.h b/mdadm.h
25786b
index 09915a00..d53df169 100644
25786b
--- a/mdadm.h
25786b
+++ b/mdadm.h
25786b
@@ -1636,6 +1636,7 @@ extern int create_mddev(char *dev, char *name, int autof, int trustworthy,
25786b
 #define	FOREIGN	2
25786b
 #define	METADATA 3
25786b
 extern int open_mddev(char *dev, int report_errors);
25786b
+extern int is_mddev(char *dev);
25786b
 extern int open_container(int fd);
25786b
 extern int metadata_container_matches(char *metadata, char *devnm);
25786b
 extern int metadata_subdev_matches(char *metadata, char *devnm);
25786b
diff --git a/mdopen.c b/mdopen.c
25786b
index 245be537..d18c9319 100644
25786b
--- a/mdopen.c
25786b
+++ b/mdopen.c
25786b
@@ -475,6 +475,23 @@ int open_mddev(char *dev, int report_errors)
25786b
 	return mdfd;
25786b
 }
25786b
 
25786b
+/**
25786b
+ * is_mddev() - check that file name passed is an md device.
25786b
+ * @dev: file name that has to be checked.
25786b
+ * Return: 1 if file passed is an md device, 0 if not.
25786b
+ */
25786b
+int is_mddev(char *dev)
25786b
+{
25786b
+	int fd = open_mddev(dev, 1);
25786b
+
25786b
+	if (fd >= 0) {
25786b
+		close(fd);
25786b
+		return 1;
25786b
+	}
25786b
+
25786b
+	return 0;
25786b
+}
25786b
+
25786b
 char *find_free_devnm(int use_partitions)
25786b
 {
25786b
 	static char devnm[32];
25786b
-- 
91179e
2.38.1
25786b