|
@@ -830,6 +830,28 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
|
|
goto out;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If this is a user namespace mount, no contexts are allowed
|
|
|
+ * on the command line and security labels must be ignored.
|
|
|
+ */
|
|
|
+ if (sb->s_user_ns != &init_user_ns) {
|
|
|
+ if (context_sid || fscontext_sid || rootcontext_sid ||
|
|
|
+ defcontext_sid) {
|
|
|
+ rc = -EACCES;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
|
|
|
+ sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
|
|
|
+ rc = security_transition_sid(current_sid(), current_sid(),
|
|
|
+ SECCLASS_FILE, NULL,
|
|
|
+ &sbsec->mntpoint_sid);
|
|
|
+ if (rc)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ goto out_set_opts;
|
|
|
+ }
|
|
|
+
|
|
|
/* sets the context of the superblock for the fs being mounted. */
|
|
|
if (fscontext_sid) {
|
|
|
rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
|
|
@@ -898,6 +920,7 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
|
|
sbsec->def_sid = defcontext_sid;
|
|
|
}
|
|
|
|
|
|
+out_set_opts:
|
|
|
rc = sb_finish_set_opts(sb);
|
|
|
out:
|
|
|
mutex_unlock(&sbsec->lock);
|