|
|
@@ -497,16 +497,10 @@ static int may_context_mount_inode_relabel(u32 sid,
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-static int selinux_is_sblabel_mnt(struct super_block *sb)
|
|
|
+static int selinux_is_genfs_special_handling(struct super_block *sb)
|
|
|
{
|
|
|
- struct superblock_security_struct *sbsec = sb->s_security;
|
|
|
-
|
|
|
- return sbsec->behavior == SECURITY_FS_USE_XATTR ||
|
|
|
- sbsec->behavior == SECURITY_FS_USE_TRANS ||
|
|
|
- sbsec->behavior == SECURITY_FS_USE_TASK ||
|
|
|
- sbsec->behavior == SECURITY_FS_USE_NATIVE ||
|
|
|
- /* Special handling. Genfs but also in-core setxattr handler */
|
|
|
- !strcmp(sb->s_type->name, "sysfs") ||
|
|
|
+ /* Special handling. Genfs but also in-core setxattr handler */
|
|
|
+ return !strcmp(sb->s_type->name, "sysfs") ||
|
|
|
!strcmp(sb->s_type->name, "pstore") ||
|
|
|
!strcmp(sb->s_type->name, "debugfs") ||
|
|
|
!strcmp(sb->s_type->name, "tracefs") ||
|
|
|
@@ -516,6 +510,34 @@ static int selinux_is_sblabel_mnt(struct super_block *sb)
|
|
|
!strcmp(sb->s_type->name, "cgroup2")));
|
|
|
}
|
|
|
|
|
|
+static int selinux_is_sblabel_mnt(struct super_block *sb)
|
|
|
+{
|
|
|
+ struct superblock_security_struct *sbsec = sb->s_security;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * IMPORTANT: Double-check logic in this function when adding a new
|
|
|
+ * SECURITY_FS_USE_* definition!
|
|
|
+ */
|
|
|
+ BUILD_BUG_ON(SECURITY_FS_USE_MAX != 7);
|
|
|
+
|
|
|
+ switch (sbsec->behavior) {
|
|
|
+ case SECURITY_FS_USE_XATTR:
|
|
|
+ case SECURITY_FS_USE_TRANS:
|
|
|
+ case SECURITY_FS_USE_TASK:
|
|
|
+ case SECURITY_FS_USE_NATIVE:
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ case SECURITY_FS_USE_GENFS:
|
|
|
+ return selinux_is_genfs_special_handling(sb);
|
|
|
+
|
|
|
+ /* Never allow relabeling on context mounts */
|
|
|
+ case SECURITY_FS_USE_MNTPOINT:
|
|
|
+ case SECURITY_FS_USE_NONE:
|
|
|
+ default:
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int sb_finish_set_opts(struct super_block *sb)
|
|
|
{
|
|
|
struct superblock_security_struct *sbsec = sb->s_security;
|