|
@@ -724,7 +724,10 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
|
|
}
|
|
|
|
|
|
if (strcmp(sb->s_type->name, "proc") == 0)
|
|
|
- sbsec->flags |= SE_SBPROC;
|
|
|
+ sbsec->flags |= SE_SBPROC | SE_SBGENFS;
|
|
|
+
|
|
|
+ if (strcmp(sb->s_type->name, "debugfs") == 0)
|
|
|
+ sbsec->flags |= SE_SBGENFS;
|
|
|
|
|
|
if (!sbsec->behavior) {
|
|
|
/*
|
|
@@ -1232,12 +1235,13 @@ static inline u16 socket_type_to_security_class(int family, int type, int protoc
|
|
|
return SECCLASS_SOCKET;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_PROC_FS
|
|
|
-static int selinux_proc_get_sid(struct dentry *dentry,
|
|
|
- u16 tclass,
|
|
|
- u32 *sid)
|
|
|
+static int selinux_genfs_get_sid(struct dentry *dentry,
|
|
|
+ u16 tclass,
|
|
|
+ u16 flags,
|
|
|
+ u32 *sid)
|
|
|
{
|
|
|
int rc;
|
|
|
+ struct super_block *sb = dentry->d_inode->i_sb;
|
|
|
char *buffer, *path;
|
|
|
|
|
|
buffer = (char *)__get_free_page(GFP_KERNEL);
|
|
@@ -1248,26 +1252,20 @@ static int selinux_proc_get_sid(struct dentry *dentry,
|
|
|
if (IS_ERR(path))
|
|
|
rc = PTR_ERR(path);
|
|
|
else {
|
|
|
- /* each process gets a /proc/PID/ entry. Strip off the
|
|
|
- * PID part to get a valid selinux labeling.
|
|
|
- * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
|
|
|
- while (path[1] >= '0' && path[1] <= '9') {
|
|
|
- path[1] = '/';
|
|
|
- path++;
|
|
|
+ if (flags & SE_SBPROC) {
|
|
|
+ /* each process gets a /proc/PID/ entry. Strip off the
|
|
|
+ * PID part to get a valid selinux labeling.
|
|
|
+ * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
|
|
|
+ while (path[1] >= '0' && path[1] <= '9') {
|
|
|
+ path[1] = '/';
|
|
|
+ path++;
|
|
|
+ }
|
|
|
}
|
|
|
- rc = security_genfs_sid("proc", path, tclass, sid);
|
|
|
+ rc = security_genfs_sid(sb->s_type->name, path, tclass, sid);
|
|
|
}
|
|
|
free_page((unsigned long)buffer);
|
|
|
return rc;
|
|
|
}
|
|
|
-#else
|
|
|
-static int selinux_proc_get_sid(struct dentry *dentry,
|
|
|
- u16 tclass,
|
|
|
- u32 *sid)
|
|
|
-{
|
|
|
- return -EINVAL;
|
|
|
-}
|
|
|
-#endif
|
|
|
|
|
|
/* The inode's security attributes must be initialized before first use. */
|
|
|
static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
|
|
@@ -1424,7 +1422,7 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent
|
|
|
/* Default to the fs superblock SID. */
|
|
|
isec->sid = sbsec->sid;
|
|
|
|
|
|
- if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
|
|
|
+ if ((sbsec->flags & SE_SBGENFS) && !S_ISLNK(inode->i_mode)) {
|
|
|
/* We must have a dentry to determine the label on
|
|
|
* procfs inodes */
|
|
|
if (opt_dentry)
|
|
@@ -1447,7 +1445,8 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent
|
|
|
if (!dentry)
|
|
|
goto out_unlock;
|
|
|
isec->sclass = inode_mode_to_security_class(inode->i_mode);
|
|
|
- rc = selinux_proc_get_sid(dentry, isec->sclass, &sid);
|
|
|
+ rc = selinux_genfs_get_sid(dentry, isec->sclass,
|
|
|
+ sbsec->flags, &sid);
|
|
|
dput(dentry);
|
|
|
if (rc)
|
|
|
goto out_unlock;
|