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

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