diff options
| author | Julia Kreger <juliaashleykreger@gmail.com> | 2022-08-24 10:15:27 -0700 |
|---|---|---|
| committer | Julia Kreger <juliaashleykreger@gmail.com> | 2022-08-24 10:15:27 -0700 |
| commit | f3e3de8097f05cc830768da7d3f3e9eae04b40a1 (patch) | |
| tree | f6cc42efc976dd9e2abb4e7a817647a58ae6f1aa /ironic_python_agent | |
| parent | f89d54f4b89cdf3b5b079f6b48d26983f266b6a2 (diff) | |
| download | ironic-python-agent-f3e3de8097f05cc830768da7d3f3e9eae04b40a1.tar.gz | |
Fix software raid output poisoning
In the event a device name is set to contain a raid device path,
it is possible for the Name and Events field values of mdadm's
detailed output to contain text which inadvertently gets captured and
mapped as component data for the "holder" devices of the RAID set.
This would cause invalid values to get passed to UEFI methods
which would cause a deployment to fail under these circumstances.
We now ignore the Name and Events fields in mdadm output.
Change-Id: If721dfe1caa5915326482969e55fbf4697538231
Diffstat (limited to 'ironic_python_agent')
| -rw-r--r-- | ironic_python_agent/hardware.py | 3 | ||||
| -rw-r--r-- | ironic_python_agent/tests/unit/samples/hardware_samples.py | 28 | ||||
| -rw-r--r-- | ironic_python_agent/tests/unit/test_hardware.py | 6 |
3 files changed, 36 insertions, 1 deletions
diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index ebd48098..6c3b4184 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -382,9 +382,10 @@ def get_holder_disks(raid_device): holder_parts = [] for line in lines[1:]: + if 'Events' in line or 'Name' in line: + continue device = re.findall(r'/dev/\w+', line) holder_parts += device - for part in holder_parts: # NOTE(mnaser): If the last character is not a digit and it is a valid # device, this means that instead of a partition, it's a diff --git a/ironic_python_agent/tests/unit/samples/hardware_samples.py b/ironic_python_agent/tests/unit/samples/hardware_samples.py index 82f29eb7..f9635e43 100644 --- a/ironic_python_agent/tests/unit/samples/hardware_samples.py +++ b/ironic_python_agent/tests/unit/samples/hardware_samples.py @@ -1049,6 +1049,34 @@ MDADM_DETAIL_OUTPUT_BROKEN_RAID0 = ("""/dev/md126: - 8 2 - /dev/sda2 """) +# NOTE(TheJulia): The name and events field, in some cases can +# match the regex causing parsing of the text to fail. +MDADM_DETAIL_POISONED = ("""/dev/md0: + Version : 1.2 + Creation Time : Wed Aug 17 16:09:19 2022 + Raid Level : raid1 + Array Size : 4673536 (4.46 GiB 4.79 GB) + Used Dev Size : 4673536 (4.46 GiB 4.79 GB) + Raid Devices : 2 + Total Devices : 2 + Persistence : Superblock is persistent + + Update Time : Wed Aug 17 16:10:03 2022 + State : clean + Active Devices : 2 +Working Devices : 2 + Failed Devices : 0 + Spare Devices : 0 + + Name : box:/dev/md0 (local to host box) + UUID : e50fb152:aa80db1d:3c901b03:dd280e35 + Events : 21/dev/md/dev/md + + Number Major Minor RaidDevice State + 0 251 1 0 active sync /dev/vda1 + 1 251 17 1 active sync /dev/vdb1 +""") + MDADM_EXAMINE_OUTPUT_MEMBER = ("""/dev/sda1: Magic : a92b4efc Version : 1.2 diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 1e2c6f8b..57a2330a 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -4450,6 +4450,12 @@ class TestGenericHardwareManager(base.IronicAgentTest): holder_disks = hardware.get_holder_disks('/dev/md126') self.assertEqual(['/dev/sda'], holder_disks) + @mock.patch.object(il_utils, 'execute', autospec=True) + def test_get_holder_disks_poisoned_output(self, mocked_execute): + mocked_execute.side_effect = [(hws.MDADM_DETAIL_POISONED, '')] + holder_disks = hardware.get_holder_disks('/dev/md0') + self.assertEqual(['/dev/vda', '/dev/vdb'], holder_disks) + @mock.patch.object(hardware, 'get_holder_disks', autospec=True) @mock.patch.object(hardware, 'get_component_devices', autospec=True) @mock.patch.object(hardware, 'list_all_block_devices', autospec=True) |
