Skip to content

Commit

Permalink
kernfs: use simple_xattrs for security attributes
Browse files Browse the repository at this point in the history
Replace the special handling of security xattrs with simple_xattrs, as
is already done for the trusted xattrs. This simplifies the code and
allows LSMs to use more than just a single xattr to do their business.

Signed-off-by: Ondrej Mosnacek <[email protected]>
Acked-by: Casey Schaufler <[email protected]>
[PM: manual merge fixes]
Signed-off-by: Paul Moore <[email protected]>
  • Loading branch information
WOnder93 authored and pcmoore committed Mar 21, 2019
1 parent b754026 commit 0ac6075
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 58 deletions.
3 changes: 0 additions & 3 deletions fs/kernfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -532,9 +532,6 @@ void kernfs_put(struct kernfs_node *kn)
kfree_const(kn->name);

if (kn->iattr) {
if (kn->iattr->ia_secdata)
security_release_secctx(kn->iattr->ia_secdata,
kn->iattr->ia_secdata_len);
simple_xattrs_free(&kn->iattr->xattrs);
kmem_cache_free(kernfs_iattrs_cache, kn->iattr);
}
Expand Down
55 changes: 2 additions & 53 deletions fs/kernfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,23 +137,6 @@ int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr)
return error;
}

static int kernfs_node_setsecdata(struct kernfs_iattrs *attrs, void **secdata,
u32 *secdata_len)
{
void *old_secdata;
size_t old_secdata_len;

old_secdata = attrs->ia_secdata;
old_secdata_len = attrs->ia_secdata_len;

attrs->ia_secdata = *secdata;
attrs->ia_secdata_len = *secdata_len;

*secdata = old_secdata;
*secdata_len = old_secdata_len;
return 0;
}

ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size)
{
struct kernfs_node *kn = kernfs_dentry_node(dentry);
Expand Down Expand Up @@ -189,15 +172,12 @@ static void kernfs_refresh_inode(struct kernfs_node *kn, struct inode *inode)
struct kernfs_iattrs *attrs = kn->iattr;

inode->i_mode = kn->mode;
if (attrs) {
if (attrs)
/*
* kernfs_node has non-default attributes get them from
* persistent copy in kernfs_node.
*/
set_inode_attr(inode, attrs);
security_inode_notifysecctx(inode, attrs->ia_secdata,
attrs->ia_secdata_len);
}

if (kernfs_type(kn) == KERNFS_DIR)
set_nlink(inode, kn->dir.subdirs + 2);
Expand Down Expand Up @@ -345,41 +325,10 @@ static const struct xattr_handler kernfs_trusted_xattr_handler = {
.set = kernfs_xattr_set,
};

static int kernfs_security_xattr_set(const struct xattr_handler *handler,
struct dentry *unused, struct inode *inode,
const char *suffix, const void *value,
size_t size, int flags)
{
struct kernfs_node *kn = inode->i_private;
struct kernfs_iattrs *attrs;
void *secdata;
u32 secdata_len = 0;
int error;

attrs = kernfs_iattrs(kn);
if (!attrs)
return -ENOMEM;

error = security_inode_setsecurity(inode, suffix, value, size, flags);
if (error)
return error;
error = security_inode_getsecctx(inode, &secdata, &secdata_len);
if (error)
return error;

mutex_lock(&kernfs_mutex);
error = kernfs_node_setsecdata(attrs, &secdata, &secdata_len);
mutex_unlock(&kernfs_mutex);

if (secdata)
security_release_secctx(secdata, secdata_len);
return error;
}

static const struct xattr_handler kernfs_security_xattr_handler = {
.prefix = XATTR_SECURITY_PREFIX,
.get = kernfs_xattr_get,
.set = kernfs_security_xattr_set,
.set = kernfs_xattr_set,
};

const struct xattr_handler *kernfs_xattr_handlers[] = {
Expand Down
2 changes: 0 additions & 2 deletions fs/kernfs/kernfs-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ struct kernfs_iattrs {
struct timespec64 ia_atime;
struct timespec64 ia_mtime;
struct timespec64 ia_ctime;
void *ia_secdata;
u32 ia_secdata_len;

struct simple_xattrs xattrs;
};
Expand Down

0 comments on commit 0ac6075

Please sign in to comment.