xref: /openbmc/linux/fs/ext4/xattr_security.c (revision 39f60c1c)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2ac27a0ecSDave Kleikamp /*
3617ba13bSMingming Cao  * linux/fs/ext4/xattr_security.c
4ac27a0ecSDave Kleikamp  * Handler for storing security labels as extended attributes.
5ac27a0ecSDave Kleikamp  */
6ac27a0ecSDave Kleikamp 
7ac27a0ecSDave Kleikamp #include <linux/string.h>
8ac27a0ecSDave Kleikamp #include <linux/fs.h>
9ac27a0ecSDave Kleikamp #include <linux/security.h>
105a0e3ad6STejun Heo #include <linux/slab.h>
113dcf5451SChristoph Hellwig #include "ext4_jbd2.h"
123dcf5451SChristoph Hellwig #include "ext4.h"
13ac27a0ecSDave Kleikamp #include "xattr.h"
14ac27a0ecSDave Kleikamp 
15ac27a0ecSDave Kleikamp static int
ext4_xattr_security_get(const struct xattr_handler * handler,struct dentry * unused,struct inode * inode,const char * name,void * buffer,size_t size)16d9a82a04SAndreas Gruenbacher ext4_xattr_security_get(const struct xattr_handler *handler,
17b296821aSAl Viro 			struct dentry *unused, struct inode *inode,
18b296821aSAl Viro 			const char *name, void *buffer, size_t size)
19ac27a0ecSDave Kleikamp {
20b296821aSAl Viro 	return ext4_xattr_get(inode, EXT4_XATTR_INDEX_SECURITY,
21431547b3SChristoph Hellwig 			      name, buffer, size);
22ac27a0ecSDave Kleikamp }
23ac27a0ecSDave Kleikamp 
24ac27a0ecSDave Kleikamp static int
ext4_xattr_security_set(const struct xattr_handler * handler,struct mnt_idmap * idmap,struct dentry * unused,struct inode * inode,const char * name,const void * value,size_t size,int flags)25d9a82a04SAndreas Gruenbacher ext4_xattr_security_set(const struct xattr_handler *handler,
26*39f60c1cSChristian Brauner 			struct mnt_idmap *idmap,
2759301226SAl Viro 			struct dentry *unused, struct inode *inode,
2859301226SAl Viro 			const char *name, const void *value,
2959301226SAl Viro 			size_t size, int flags)
30ac27a0ecSDave Kleikamp {
3159301226SAl Viro 	return ext4_xattr_set(inode, EXT4_XATTR_INDEX_SECURITY,
32431547b3SChristoph Hellwig 			      name, value, size, flags);
33ac27a0ecSDave Kleikamp }
34ac27a0ecSDave Kleikamp 
35176576dbSDjalal Harouni static int
ext4_initxattrs(struct inode * inode,const struct xattr * xattr_array,void * fs_info)36176576dbSDjalal Harouni ext4_initxattrs(struct inode *inode, const struct xattr *xattr_array,
379d8f13baSMimi Zohar 		void *fs_info)
389d8f13baSMimi Zohar {
399d8f13baSMimi Zohar 	const struct xattr *xattr;
409d8f13baSMimi Zohar 	handle_t *handle = fs_info;
419d8f13baSMimi Zohar 	int err = 0;
429d8f13baSMimi Zohar 
439d8f13baSMimi Zohar 	for (xattr = xattr_array; xattr->name != NULL; xattr++) {
449d8f13baSMimi Zohar 		err = ext4_xattr_set_handle(handle, inode,
459d8f13baSMimi Zohar 					    EXT4_XATTR_INDEX_SECURITY,
469d8f13baSMimi Zohar 					    xattr->name, xattr->value,
473f706c8cSEryu Guan 					    xattr->value_len, XATTR_CREATE);
489d8f13baSMimi Zohar 		if (err < 0)
499d8f13baSMimi Zohar 			break;
509d8f13baSMimi Zohar 	}
519d8f13baSMimi Zohar 	return err;
529d8f13baSMimi Zohar }
539d8f13baSMimi Zohar 
54ac27a0ecSDave Kleikamp int
ext4_init_security(handle_t * handle,struct inode * inode,struct inode * dir,const struct qstr * qstr)552a7dba39SEric Paris ext4_init_security(handle_t *handle, struct inode *inode, struct inode *dir,
562a7dba39SEric Paris 		   const struct qstr *qstr)
57ac27a0ecSDave Kleikamp {
589d8f13baSMimi Zohar 	return security_inode_init_security(inode, dir, qstr,
599d8f13baSMimi Zohar 					    &ext4_initxattrs, handle);
60ac27a0ecSDave Kleikamp }
61ac27a0ecSDave Kleikamp 
6211e27528SStephen Hemminger const struct xattr_handler ext4_xattr_security_handler = {
63ac27a0ecSDave Kleikamp 	.prefix	= XATTR_SECURITY_PREFIX,
64617ba13bSMingming Cao 	.get	= ext4_xattr_security_get,
65617ba13bSMingming Cao 	.set	= ext4_xattr_security_set,
66ac27a0ecSDave Kleikamp };
67