1 // SPDX-License-Identifier: GPL-2.0
3 * linux/fs/hfsplus/xattr_trusted.c
5 * Vyacheslav Dubeyko <slava@dubeyko.com>
7 * Handler for storing security labels as extended attributes.
10 #include <linux/security.h>
11 #include <linux/nls.h>
13 #include "hfsplus_fs.h"
17 static int hfsplus_security_getxattr(const struct xattr_handler
*handler
,
18 struct dentry
*unused
, struct inode
*inode
,
19 const char *name
, void *buffer
, size_t size
)
21 return hfsplus_getxattr(inode
, name
, buffer
, size
,
22 XATTR_SECURITY_PREFIX
,
23 XATTR_SECURITY_PREFIX_LEN
);
26 static int hfsplus_security_setxattr(const struct xattr_handler
*handler
,
27 struct dentry
*unused
, struct inode
*inode
,
28 const char *name
, const void *buffer
,
29 size_t size
, int flags
)
31 return hfsplus_setxattr(inode
, name
, buffer
, size
, flags
,
32 XATTR_SECURITY_PREFIX
,
33 XATTR_SECURITY_PREFIX_LEN
);
36 static int hfsplus_initxattrs(struct inode
*inode
,
37 const struct xattr
*xattr_array
,
40 const struct xattr
*xattr
;
44 xattr_name
= kmalloc(NLS_MAX_CHARSET_SIZE
* HFSPLUS_ATTR_MAX_STRLEN
+ 1,
48 for (xattr
= xattr_array
; xattr
->name
!= NULL
; xattr
++) {
50 if (!strcmp(xattr
->name
, ""))
53 strcpy(xattr_name
, XATTR_SECURITY_PREFIX
);
55 XATTR_SECURITY_PREFIX_LEN
, xattr
->name
);
57 XATTR_SECURITY_PREFIX_LEN
+ strlen(xattr
->name
), 0, 1);
59 err
= __hfsplus_setxattr(inode
, xattr_name
,
60 xattr
->value
, xattr
->value_len
, 0);
68 int hfsplus_init_security(struct inode
*inode
, struct inode
*dir
,
69 const struct qstr
*qstr
)
71 return security_inode_init_security(inode
, dir
, qstr
,
72 &hfsplus_initxattrs
, NULL
);
75 int hfsplus_init_inode_security(struct inode
*inode
,
77 const struct qstr
*qstr
)
81 err
= hfsplus_init_posix_acl(inode
, dir
);
83 err
= hfsplus_init_security(inode
, dir
, qstr
);
87 const struct xattr_handler hfsplus_xattr_security_handler
= {
88 .prefix
= XATTR_SECURITY_PREFIX
,
89 .get
= hfsplus_security_getxattr
,
90 .set
= hfsplus_security_setxattr
,