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