From b22d97b2c1cb03d1ab112196bd931ee83ef2485d Mon Sep 17 00:00:00 2001 From: Sam Doran Date: Mon, 11 Jan 2021 01:55:15 -0500 Subject: [PATCH] [stable-2.10] Fix string/bytestring comparsion in m_u.basic (#70439) (#73129) Change: - module_utils.basic.is_special_selinux_path() used a string == bytestring comparison which returned False and made Ansible think that certain filesystems aren't, in fact, special-cased, when they should be. Ensure both sides of the == are bytestrings. Test Plan: - Added `copy` integration tests for this case. Tickets: - Fixes #70244 Signed-off-by: Rick Elrod . (cherry picked from commit 688cd8657bcd4610aa268913be67e76778bc6940) --- .../fragments/70244-selinux-special-fs.yml | 2 ++ lib/ansible/module_utils/basic.py | 5 +-- .../targets/copy/tasks/selinux.yml | 35 +++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/70244-selinux-special-fs.yml create mode 100644 test/integration/targets/copy/tasks/selinux.yml diff --git a/changelogs/fragments/70244-selinux-special-fs.yml b/changelogs/fragments/70244-selinux-special-fs.yml new file mode 100644 index 00000000000..e4a596bb649 --- /dev/null +++ b/changelogs/fragments/70244-selinux-special-fs.yml @@ -0,0 +1,2 @@ +bugfixes: + - Fix bytestring vs string comparison in module_utils.basic.is_special_selinux_path() so that special-cased filesystems which don't support SELinux context attributes still allow files to be manipulated on them. (https://github.com/ansible/ansible/issues/70244) diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py index 24d225f5c17..cd190f50969 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -978,11 +978,12 @@ class AnsibleModule(object): f.close() except Exception: return (False, None) + path_mount_point = self.find_mount_point(path) + for line in mount_data: (device, mount_point, fstype, options, rest) = line.split(' ', 4) - - if path_mount_point == mount_point: + if to_bytes(path_mount_point) == to_bytes(mount_point): for fs in self._selinux_special_fs: if fs in fstype: special_context = self.selinux_context(path_mount_point) diff --git a/test/integration/targets/copy/tasks/selinux.yml b/test/integration/targets/copy/tasks/selinux.yml new file mode 100644 index 00000000000..6bd3b04f6fe --- /dev/null +++ b/test/integration/targets/copy/tasks/selinux.yml @@ -0,0 +1,35 @@ +# Ensure that our logic for special filesystems works as intended +# https://github.com/ansible/ansible/issues/70244 +- block: + - name: Install dosfstools + yum: + name: dosfstools + state: present + + - name: Create a file to use for a fat16 filesystem + command: dd if=/dev/zero of=/fat16 bs=1024 count=10240 + + - name: mkfs.fat + command: mkfs.fat -F16 /fat16 + + - name: Mount it + command: mount /fat16 /mnt + + - name: Copy a file to it + copy: + src: /etc/fstab + dest: /mnt/fstab + always: + - name: Unmount it + command: umount /mnt + ignore_errors: true + + - name: Nuke /fat16 + file: + path: /fat16 + state: absent + + - name: Uninstall dosfstools + yum: + name: dosfstools + state: absent