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"
16 static int hfsplus_security_getxattr(const struct xattr_handler
*handler
,
17 struct dentry
*unused
, struct inode
*inode
,
18 const char *name
, void *buffer
, size_t size
)
20 return hfsplus_getxattr(inode
, name
, buffer
, size
,
21 XATTR_SECURITY_PREFIX
,
22 XATTR_SECURITY_PREFIX_LEN
);
25 static int hfsplus_security_setxattr(const struct xattr_handler
*handler
,
26 struct dentry
*unused
, struct inode
*inode
,
27 const char *name
, const void *buffer
,
28 size_t size
, int flags
)
30 return hfsplus_setxattr(inode
, name
, buffer
, size
, flags
,
31 XATTR_SECURITY_PREFIX
,
32 XATTR_SECURITY_PREFIX_LEN
);
35 static int hfsplus_initxattrs(struct inode
*inode
,
36 const struct xattr
*xattr_array
,
39 const struct xattr
*xattr
;
43 xattr_name
= kmalloc(NLS_MAX_CHARSET_SIZE
* HFSPLUS_ATTR_MAX_STRLEN
+ 1,
47 for (xattr
= xattr_array
; xattr
->name
!= NULL
; xattr
++) {
49 if (!strcmp(xattr
->name
, ""))
52 strcpy(xattr_name
, XATTR_SECURITY_PREFIX
);
54 XATTR_SECURITY_PREFIX_LEN
, xattr
->name
);
56 XATTR_SECURITY_PREFIX_LEN
+ strlen(xattr
->name
), 0, 1);
58 err
= __hfsplus_setxattr(inode
, xattr_name
,
59 xattr
->value
, xattr
->value_len
, 0);
67 int hfsplus_init_security(struct inode
*inode
, struct inode
*dir
,
68 const struct qstr
*qstr
)
70 return security_inode_init_security(inode
, dir
, qstr
,
71 &hfsplus_initxattrs
, NULL
);
74 const struct xattr_handler hfsplus_xattr_security_handler
= {
75 .prefix
= XATTR_SECURITY_PREFIX
,
76 .get
= hfsplus_security_getxattr
,
77 .set
= hfsplus_security_setxattr
,