libmultipath: limit paths that can get wwid from environment
Currently, whenever getting the uid_attribute from the udev database fails, multipath will try to get it from the environment variables. This normally isn't a problem, since either multipath -u is getting called from a uevent and the environment will have the correct value in that variable, or something else is being run and that variable won't be set. However, when find_multipaths is configured to "smart", this causes problems. For maybe devices, multipath needs to get the WWIDs of all the other block devices, to see if they match the maybe device wwid. If one of those devices doesn't have uid_attribute set in its udev database, multipath will fall back to checking the environment for it, and it will find that variable set to the WWID of the maybe device that this uevent is for. This means that all devices with no WWID will end up appearing to have the same WWID as the maybe device, causing multipath to incorrectly claim it.
This commit is contained in:
parent
35ad6d85c1
commit
586476ba6b
@ -0,0 +1,69 @@
|
||||
From 694a29d909268868eb2d855303a0420c2baeffda Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 9 Feb 2023 11:28:31 -0600
|
||||
Subject: [PATCH] libmultipath: limit paths that can get wwid from environment
|
||||
|
||||
Currently, whenever getting the uid_attribute from the udev database
|
||||
fails, multipath will try to get it from the environment variables. This
|
||||
normally isn't a problem, since either multipath -u is getting called
|
||||
from a uevent and the environment will have the correct value in that
|
||||
variable, or something else is being run and that variable won't be set.
|
||||
However, when find_multipaths is configured to "smart", this causes
|
||||
problems. For maybe devices, multipath needs to get the WWIDs of all the
|
||||
other block devices, to see if they match the maybe device wwid. If one
|
||||
of those devices doesn't have uid_attribute set in its udev database,
|
||||
multipath will fall back to checking the environment for it, and it will
|
||||
find that variable set to the WWID of the maybe device that this uevent
|
||||
is for. This means that all devices with no WWID will end up appearing
|
||||
to have the same WWID as the maybe device, causing multipath to
|
||||
incorrectly claim it.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/discovery.c | 2 +-
|
||||
libmultipath/structs.h | 1 +
|
||||
multipath/main.c | 2 ++
|
||||
3 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index f1de837..1e3847f 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -2000,7 +2000,7 @@ get_udev_uid(struct path * pp, char *uid_attribute, struct udev_device *udev)
|
||||
const char *value;
|
||||
|
||||
value = udev_device_get_property_value(udev, uid_attribute);
|
||||
- if (!value || strlen(value) == 0)
|
||||
+ if ((!value || strlen(value) == 0) && pp->can_use_env_uid)
|
||||
value = getenv(uid_attribute);
|
||||
if (value && strlen(value)) {
|
||||
len = strlcpy(pp->wwid, value, WWID_SIZE);
|
||||
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
|
||||
index deced7d..3e73d80 100644
|
||||
--- a/libmultipath/structs.h
|
||||
+++ b/libmultipath/structs.h
|
||||
@@ -288,6 +288,7 @@ struct path {
|
||||
int find_multipaths_timeout;
|
||||
int marginal;
|
||||
int vpd_vendor_id;
|
||||
+ bool can_use_env_uid;
|
||||
/* configlet pointers */
|
||||
vector hwe;
|
||||
struct gen_path generic_path;
|
||||
diff --git a/multipath/main.c b/multipath/main.c
|
||||
index 008de0b..5f357b5 100644
|
||||
--- a/multipath/main.c
|
||||
+++ b/multipath/main.c
|
||||
@@ -677,6 +677,8 @@ check_path_valid(const char *name, struct config *conf, bool is_uevent)
|
||||
pp = alloc_path();
|
||||
if (!pp)
|
||||
return RTVL_FAIL;
|
||||
+ if (is_uevent)
|
||||
+ pp->can_use_env_uid = true;
|
||||
|
||||
r = is_path_valid(name, conf, pp, is_uevent);
|
||||
if (r <= PATH_IS_ERROR || r >= PATH_MAX_VALID_RESULT)
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
Name: multipath-tools
|
||||
Version: 0.8.4
|
||||
Release: 27
|
||||
Release: 28
|
||||
Summary: Tools to manage multipath devices with the device-mapper
|
||||
License: GPL-2.0-or-later and LGPL-2.0-only
|
||||
URL: http://christophe.varoqui.free.fr/
|
||||
@ -61,6 +61,7 @@ Patch48: 0048-multipath.conf.5-fix-documentation-for-find_multipat.patch
|
||||
Patch49: 0049-multipath.conf.5-fix-the-description-of-prio_args-fo.patch
|
||||
Patch50: 0050-multipath-display-the-correct-configuration-when-dum.patch
|
||||
Patch51: 0051-multipath-return-failure-on-an-invalid-remove-comman.patch
|
||||
Patch52: 0052-libmultipath-limit-paths-that-can-get-wwid-from-envi.patch
|
||||
|
||||
BuildRequires: multipath-tools, libcmocka, libcmocka-devel
|
||||
BuildRequires: gcc, libaio-devel, userspace-rcu-devel, device-mapper-devel >= 1.02.89
|
||||
@ -208,6 +209,9 @@ fi
|
||||
|
||||
|
||||
%changelog
|
||||
* Thu Aug 8 2024 kouwenqi <kouwenqi@kylinos.cn> - 0.8.4-28
|
||||
- libmultipath: limit paths that can get wwid from environment
|
||||
|
||||
* Wed Aug 7 2024 kouwenqi <kouwenqi@kylinos.cn> - 0.8.4-27
|
||||
- multipath: return failure on an invalid remove command
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user