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

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