On Tue, 2026-11-10 at 10:14 +0100, Christian Brauner wrote:
> Initialize selinuxfs as a pseudo filesystem. This raises SB_I_PSEUDO
> and
> SB_I_NOEXEC. selinuxfs never holds executables. SB_I_NOEXEC also
> refuses PROT_EXEC mappings but the status and policy files are only
> ever mapped for reading.
> 
> But selinuxfs needs device nodes. The kernel replaces file
> descriptors
> with /sys/fs/selinux/null on exec via dentry_open() which doesn't
> care
> about SB_I_NODEV. Android init however opens /sys/fs/selinux/null by
> path as /dev/null doesn't exist yet at that point. So clear
> SB_I_NODEV
> again in sel_fill_super().
> 
> Signed-off-by: Christian Brauner (Amutable) <[email protected]>

Reviewed-by: Alexander Mikhalitsyn <[email protected]>
   I. 
> ---
>  security/selinux/selinuxfs.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/security/selinux/selinuxfs.c
> b/security/selinux/selinuxfs.c
> index 310e19efff1d..d7ae853b6d68 100644
> --- a/security/selinux/selinuxfs.c
> +++ b/security/selinux/selinuxfs.c
> @@ -18,6 +18,7 @@
>  #include <linux/vmalloc.h>
>  #include <linux/fs.h>
>  #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
>  #include <linux/hex.h>
>  #include <linux/mount.h>
>  #include <linux/mutex.h>
> @@ -1852,6 +1853,9 @@ static int sel_fill_super(struct super_block
> *sb, struct fs_context *fc)
>   /* last one */ {"", NULL, 0}
>   };
>  
> + /* Android init opens the null device below by path. */
> + sb->s_iflags &= ~SB_I_NODEV;
> +
>   ret = selinux_fs_info_create(sb);
>   if (ret)
>   goto err;
> @@ -1955,6 +1959,7 @@ static const struct fs_context_operations
> sel_context_ops = {
>  
>  static int sel_init_fs_context(struct fs_context *fc)
>  {
> + fc_init_pseudo(fc);
>   fc->ops = &sel_context_ops;
>   return 0;
>  }

Reply via email to