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

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