kernfs: use simple_xattrs for security attributes
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 <omosnace@redhat.com> Acked-by: Casey Schaufler <casey@schaufler-ca.com> [PM: manual merge fixes] Signed-off-by: Paul Moore <paul@paul-moore.com>
This commit is contained in:
parent
b754026bd9
commit
0ac6075a32
@ -532,9 +532,6 @@ void kernfs_put(struct kernfs_node *kn)
|
|||||||
kfree_const(kn->name);
|
kfree_const(kn->name);
|
||||||
|
|
||||||
if (kn->iattr) {
|
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);
|
simple_xattrs_free(&kn->iattr->xattrs);
|
||||||
kmem_cache_free(kernfs_iattrs_cache, kn->iattr);
|
kmem_cache_free(kernfs_iattrs_cache, kn->iattr);
|
||||||
}
|
}
|
||||||
|
@ -137,23 +137,6 @@ out:
|
|||||||
return error;
|
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)
|
ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
struct kernfs_node *kn = kernfs_dentry_node(dentry);
|
struct kernfs_node *kn = kernfs_dentry_node(dentry);
|
||||||
@ -189,15 +172,12 @@ static void kernfs_refresh_inode(struct kernfs_node *kn, struct inode *inode)
|
|||||||
struct kernfs_iattrs *attrs = kn->iattr;
|
struct kernfs_iattrs *attrs = kn->iattr;
|
||||||
|
|
||||||
inode->i_mode = kn->mode;
|
inode->i_mode = kn->mode;
|
||||||
if (attrs) {
|
if (attrs)
|
||||||
/*
|
/*
|
||||||
* kernfs_node has non-default attributes get them from
|
* kernfs_node has non-default attributes get them from
|
||||||
* persistent copy in kernfs_node.
|
* persistent copy in kernfs_node.
|
||||||
*/
|
*/
|
||||||
set_inode_attr(inode, attrs);
|
set_inode_attr(inode, attrs);
|
||||||
security_inode_notifysecctx(inode, attrs->ia_secdata,
|
|
||||||
attrs->ia_secdata_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kernfs_type(kn) == KERNFS_DIR)
|
if (kernfs_type(kn) == KERNFS_DIR)
|
||||||
set_nlink(inode, kn->dir.subdirs + 2);
|
set_nlink(inode, kn->dir.subdirs + 2);
|
||||||
@ -345,41 +325,10 @@ static const struct xattr_handler kernfs_trusted_xattr_handler = {
|
|||||||
.set = kernfs_xattr_set,
|
.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 = {
|
static const struct xattr_handler kernfs_security_xattr_handler = {
|
||||||
.prefix = XATTR_SECURITY_PREFIX,
|
.prefix = XATTR_SECURITY_PREFIX,
|
||||||
.get = kernfs_xattr_get,
|
.get = kernfs_xattr_get,
|
||||||
.set = kernfs_security_xattr_set,
|
.set = kernfs_xattr_set,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct xattr_handler *kernfs_xattr_handlers[] = {
|
const struct xattr_handler *kernfs_xattr_handlers[] = {
|
||||||
|
@ -25,8 +25,6 @@ struct kernfs_iattrs {
|
|||||||
struct timespec64 ia_atime;
|
struct timespec64 ia_atime;
|
||||||
struct timespec64 ia_mtime;
|
struct timespec64 ia_mtime;
|
||||||
struct timespec64 ia_ctime;
|
struct timespec64 ia_ctime;
|
||||||
void *ia_secdata;
|
|
||||||
u32 ia_secdata_len;
|
|
||||||
|
|
||||||
struct simple_xattrs xattrs;
|
struct simple_xattrs xattrs;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user