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 872ee4300fd..78cadcebc4c 100644 --- a/lib/ansible/module_utils/basic.py +++ b/lib/ansible/module_utils/basic.py @@ -888,11 +888,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/main.yml b/test/integration/targets/copy/tasks/main.yml index fbe7a1b2459..16d042bc66f 100644 --- a/test/integration/targets/copy/tasks/main.yml +++ b/test/integration/targets/copy/tasks/main.yml @@ -74,6 +74,9 @@ - import_tasks: acls.yml when: ansible_system == 'Linux' + - import_tasks: selinux.yml + when: ansible_os_family == 'RedHat' and ansible_selinux.get('mode') == 'enforcing' + - import_tasks: check_mode.yml # https://github.com/ansible/ansible/issues/57618 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