Bug 2155560

Summary: multipath doesn't verify the argument count in config option strings it passes to the kernel
Product: Red Hat Enterprise Linux 8 Reporter: Lin Li <lilin>
Component: device-mapper-multipathAssignee: Ben Marzinski <bmarzins>
Status: CLOSED ERRATA QA Contact: Lin Li <lilin>
Severity: high Docs Contact:
Priority: unspecified    
Version: 8.8CC: agk, bmarzins, heinzm, msnitzer, prajnoha, zkabelac
Target Milestone: rcKeywords: Triaged
Target Release: 8.8   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: device-mapper-multipath-0.8.4-35.el8 Doc Type: Bug Fix
Doc Text:
Cause: Multipath doesn't verify that the argument count in the "features", "path_selector", and "hardware_handler" option strings it passes to the kernel. If users don't match the count to the actual number of arguments, the kernel will fail to parse the device table Consequence: Multipath will be unable to create or reload devices with an incorrect argument count, and will not warn users what the problem is. Fix: multipath now verifies the argument count of configuration strings, and warns users when the count doesn't match the number of arguments. Result: Users now are notified why their devices aren't created or reloaded, when they have an invalid argument count in their configuration.
Story Points: ---
Clone Of: Environment:
Last Closed: 2023-05-16 08:44:49 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Lin Li 2022-12-21 14:21:38 UTC
Description of problem:
the argument count in the "features" does not match the number of arguments that follow it

Version-Release number of selected component (if applicable):
device-mapper-multipath-0.8.4-34.el8

How reproducible:
always

Steps to Reproduce:
1.[root@storageqe-25 ~]# rpm -qa | grep multipath
device-mapper-multipath-libs-0.8.4-34.el8.x86_64
device-mapper-multipath-0.8.4-34.el8.x86_64

2.Edit /etc/multipath.conf
[root@storageqe-25 ~]# cat /etc/multipath.conf 
# device-mapper-multipath configuration file

# For a complete list of the default configuration values, run either:
# # multipath -t
# or
# # multipathd show config

# For a list of configuration options with descriptions, see the
# multipath.conf man page.

defaults {
	user_friendly_names yes
	find_multipaths yes
	enable_foreign "^$"
        path_selector "historical-service-time 0"
}

blacklist_exceptions {
        property "(SCSI_IDENT_|ID_WWN)"
}

blacklist {
}

devices {
    device {
        vendor "NETAPP"
        product "LUN"
        path_grouping_policy multibus
        path_checker tur
        features "3 no_path_retry queue pg_init_retries 50"   <------------
        hardware_handler 0
        prio ontap
        failback immediate
        rr_weight uniform
        rr_min_io 128
        flush_on_last_del yes
        dev_loss_tmo infinity
        retain_attached_hw_handler yes
        detect_prio yes
    }
}

3.[root@storageqe-25 ~]# service multipathd reload
Redirecting to /bin/systemctl reload multipathd.service

4.[root@storageqe-25 ~]# multipath -ll
360a98000324669436c2b45666c567858 dm-3 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='historical-service-time 2' prio=50 status=enabled
| |- 7:0:1:0 sdf 8:80  undef ready running
| `- 8:0:1:0 sdn 8:208 undef ready running
`-+- policy='historical-service-time 2' prio=10 status=undef
  |- 7:0:0:0 sdb 8:16  undef ready running
  `- 8:0:0:0 sdj 8:144 undef ready running
360a98000324669436c2b45666c56785a dm-4 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='historical-service-time 2' prio=50 status=enabled
| |- 7:0:1:1 sdg 8:96  undef ready running
| `- 8:0:1:1 sdo 8:224 undef ready running
`-+- policy='historical-service-time 2' prio=10 status=undef
  |- 7:0:0:1 sdc 8:32  undef ready running
  `- 8:0:0:1 sdk 8:160 undef ready running
360a98000324669436c2b45666c567861 dm-5 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='historical-service-time 2' prio=50 status=enabled
| |- 7:0:1:2 sdh 8:112 undef ready running
| `- 8:0:1:2 sdp 8:240 undef ready running
`-+- policy='historical-service-time 2' prio=10 status=undef
  |- 7:0:0:2 sdd 8:48  undef ready running
  `- 8:0:0:2 sdl 8:176 undef ready running
360a98000324669436c2b45666c567863 dm-6 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='historical-service-time 2' prio=50 status=enabled
| |- 7:0:1:3 sdi 8:128 undef ready running
| `- 8:0:1:3 sdq 65:0  undef ready running
`-+- policy='historical-service-time 2' prio=10 status=undef
  |- 7:0:0:3 sde 8:64  undef ready running
  `- 8:0:0:3 sdm 8:192 undef ready running

5.[root@storageqe-25 ~]# multipathd show config | grep -C 15 NETAPP
	device {
		vendor "NETAPP"
		product "LUN"
		path_grouping_policy "multibus"
		path_checker "tur"
		features "3 no_path_retry queue pg_init_retries 50"
		hardware_handler "0"
		prio "ontap"
		failback "immediate"
		rr_weight "uniform"
		no_path_retry "queue"
		rr_min_io 128
		flush_on_last_del "yes"
		dev_loss_tmo "infinity"
		user_friendly_names "no"
		retain_attached_hw_handler "yes"
		detect_prio "yes"
	}


Actual results:
the argument count in the "features" does not match the number of arguments that follow it

Expected results:
the argument count in the "features"  matches the number of arguments that follow it

Additional info:

Comment 6 Lin Li 2023-01-28 04:43:11 UTC
Verified on device-mapper-multipath-0.8.4-35.el8
1.[root@storageqe-25 ~]# rpm -qa | grep multipath
device-mapper-multipath-libs-0.8.4-35.el8.x86_64
device-mapper-multipath-0.8.4-35.el8.x86_64

2.Edit /etc/multipath.conf
[root@storageqe-25 ~]# cat /etc/multipath.conf 
# device-mapper-multipath configuration file

# For a complete list of the default configuration values, run either:
# # multipath -t
# or
# # multipathd show config

# For a list of configuration options with descriptions, see the
# multipath.conf man page.

defaults {
	user_friendly_names yes
	find_multipaths yes
	enable_foreign "^$"
        path_selector "historical-service-time 0"
}

blacklist_exceptions {
        property "(SCSI_IDENT_|ID_WWN)"
}

blacklist {
}

devices {
    device {
        vendor "NETAPP"
        product "LUN"
        path_grouping_policy multibus
        path_checker tur
        features "3 no_path_retry queue pg_init_retries 50"   <------------
        hardware_handler 0
        prio ontap
        failback immediate
        rr_weight uniform
        rr_min_io 128
        flush_on_last_del yes
        dev_loss_tmo infinity
        retain_attached_hw_handler yes
        detect_prio yes
    }
}

3.[root@storageqe-25 ~]# service multipathd reload
Redirecting to /bin/systemctl reload multipathd.service

4.[root@storageqe-25 ~]# multipath -ll
Jan 27 23:39:21 | /etc/multipath.conf line 29, invalid argument count for features:, got '3' expected '4'  <---------
360a98000324669436c2b45666c567858 dm-3 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| |- 7:0:1:0 sdf 8:80  active ready running
| `- 8:0:0:0 sdj 8:144 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  |- 7:0:0:0 sdb 8:16  active ready running
  `- 8:0:1:0 sdn 8:208 active ready running
360a98000324669436c2b45666c56785a dm-4 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| |- 7:0:1:1 sdg 8:96  active ready running
| `- 8:0:0:1 sdk 8:160 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  |- 7:0:0:1 sdc 8:32  active ready running
  `- 8:0:1:1 sdo 8:224 active ready running
360a98000324669436c2b45666c567861 dm-5 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| |- 7:0:1:2 sdh 8:112 active ready running
| `- 8:0:0:2 sdl 8:176 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  |- 7:0:0:2 sdd 8:48  active ready running
  `- 8:0:1:2 sdp 8:240 active ready running
360a98000324669436c2b45666c567863 dm-6 NETAPP,LUN
size=2.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| |- 7:0:1:3 sdi 8:128 active ready running
| `- 8:0:0:3 sdm 8:192 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  |- 7:0:0:3 sde 8:64  active ready running
  `- 8:0:1:3 sdq 65:0  active ready running


Test result:Users now are notified why their devices aren't created or reloaded, when they have an invalid argument count in their configuration.

Comment 8 errata-xmlrpc 2023-05-16 08:44:49 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory (Moderate: device-mapper-multipath security and bug fix update), and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHSA-2023:2948