1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2127e5f5aSVyacheslav Dubeyko /*
3127e5f5aSVyacheslav Dubeyko * linux/fs/hfsplus/xattr_trusted.c
4127e5f5aSVyacheslav Dubeyko *
5127e5f5aSVyacheslav Dubeyko * Vyacheslav Dubeyko <slava@dubeyko.com>
6127e5f5aSVyacheslav Dubeyko *
7127e5f5aSVyacheslav Dubeyko * Handler for storing security labels as extended attributes.
8127e5f5aSVyacheslav Dubeyko */
9127e5f5aSVyacheslav Dubeyko
10127e5f5aSVyacheslav Dubeyko #include <linux/security.h>
11bf29e886SHin-Tak Leung #include <linux/nls.h>
12bf29e886SHin-Tak Leung
13127e5f5aSVyacheslav Dubeyko #include "hfsplus_fs.h"
14127e5f5aSVyacheslav Dubeyko #include "xattr.h"
15127e5f5aSVyacheslav Dubeyko
hfsplus_security_getxattr(const struct xattr_handler * handler,struct dentry * unused,struct inode * inode,const char * name,void * buffer,size_t size)16d9a82a04SAndreas Gruenbacher static int hfsplus_security_getxattr(const struct xattr_handler *handler,
17b296821aSAl Viro struct dentry *unused, struct inode *inode,
18b296821aSAl Viro const char *name, void *buffer, size_t size)
19127e5f5aSVyacheslav Dubeyko {
20b296821aSAl Viro return hfsplus_getxattr(inode, name, buffer, size,
21a3cef4cdSFabian Frederick XATTR_SECURITY_PREFIX,
22a3cef4cdSFabian Frederick XATTR_SECURITY_PREFIX_LEN);
23127e5f5aSVyacheslav Dubeyko }
24127e5f5aSVyacheslav Dubeyko
hfsplus_security_setxattr(const struct xattr_handler * handler,struct mnt_idmap * idmap,struct dentry * unused,struct inode * inode,const char * name,const void * buffer,size_t size,int flags)25d9a82a04SAndreas Gruenbacher static int hfsplus_security_setxattr(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 *buffer,
2959301226SAl Viro size_t size, int flags)
30127e5f5aSVyacheslav Dubeyko {
3159301226SAl Viro return hfsplus_setxattr(inode, name, buffer, size, flags,
325e61473eSFabian Frederick XATTR_SECURITY_PREFIX,
335e61473eSFabian Frederick XATTR_SECURITY_PREFIX_LEN);
34127e5f5aSVyacheslav Dubeyko }
35127e5f5aSVyacheslav Dubeyko
hfsplus_initxattrs(struct inode * inode,const struct xattr * xattr_array,void * fs_info)36127e5f5aSVyacheslav Dubeyko static int hfsplus_initxattrs(struct inode *inode,
37127e5f5aSVyacheslav Dubeyko const struct xattr *xattr_array,
38127e5f5aSVyacheslav Dubeyko void *fs_info)
39127e5f5aSVyacheslav Dubeyko {
40127e5f5aSVyacheslav Dubeyko const struct xattr *xattr;
41bf29e886SHin-Tak Leung char *xattr_name;
42127e5f5aSVyacheslav Dubeyko int err = 0;
43127e5f5aSVyacheslav Dubeyko
44bf29e886SHin-Tak Leung xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1,
45bf29e886SHin-Tak Leung GFP_KERNEL);
46bf29e886SHin-Tak Leung if (!xattr_name)
47bf29e886SHin-Tak Leung return -ENOMEM;
48127e5f5aSVyacheslav Dubeyko for (xattr = xattr_array; xattr->name != NULL; xattr++) {
49127e5f5aSVyacheslav Dubeyko
50bf29e886SHin-Tak Leung if (!strcmp(xattr->name, ""))
51127e5f5aSVyacheslav Dubeyko continue;
52127e5f5aSVyacheslav Dubeyko
53127e5f5aSVyacheslav Dubeyko strcpy(xattr_name, XATTR_SECURITY_PREFIX);
54127e5f5aSVyacheslav Dubeyko strcpy(xattr_name +
55127e5f5aSVyacheslav Dubeyko XATTR_SECURITY_PREFIX_LEN, xattr->name);
56127e5f5aSVyacheslav Dubeyko memset(xattr_name +
57bf29e886SHin-Tak Leung XATTR_SECURITY_PREFIX_LEN + strlen(xattr->name), 0, 1);
58127e5f5aSVyacheslav Dubeyko
59127e5f5aSVyacheslav Dubeyko err = __hfsplus_setxattr(inode, xattr_name,
60127e5f5aSVyacheslav Dubeyko xattr->value, xattr->value_len, 0);
61127e5f5aSVyacheslav Dubeyko if (err)
62127e5f5aSVyacheslav Dubeyko break;
63127e5f5aSVyacheslav Dubeyko }
64bf29e886SHin-Tak Leung kfree(xattr_name);
65127e5f5aSVyacheslav Dubeyko return err;
66127e5f5aSVyacheslav Dubeyko }
67127e5f5aSVyacheslav Dubeyko
hfsplus_init_security(struct inode * inode,struct inode * dir,const struct qstr * qstr)68127e5f5aSVyacheslav Dubeyko int hfsplus_init_security(struct inode *inode, struct inode *dir,
69127e5f5aSVyacheslav Dubeyko const struct qstr *qstr)
70127e5f5aSVyacheslav Dubeyko {
71127e5f5aSVyacheslav Dubeyko return security_inode_init_security(inode, dir, qstr,
72127e5f5aSVyacheslav Dubeyko &hfsplus_initxattrs, NULL);
73127e5f5aSVyacheslav Dubeyko }
74127e5f5aSVyacheslav Dubeyko
75127e5f5aSVyacheslav Dubeyko const struct xattr_handler hfsplus_xattr_security_handler = {
76127e5f5aSVyacheslav Dubeyko .prefix = XATTR_SECURITY_PREFIX,
77127e5f5aSVyacheslav Dubeyko .get = hfsplus_security_getxattr,
78127e5f5aSVyacheslav Dubeyko .set = hfsplus_security_setxattr,
79127e5f5aSVyacheslav Dubeyko };
80