1 /* 2 * linux/fs/hfsplus/xattr_trusted.c 3 * 4 * Vyacheslav Dubeyko <slava@dubeyko.com> 5 * 6 * Handler for storing security labels as extended attributes. 7 */ 8 9 #include <linux/security.h> 10 #include <linux/nls.h> 11 12 #include "hfsplus_fs.h" 13 #include "xattr.h" 14 #include "acl.h" 15 16 static int hfsplus_security_getxattr(const struct xattr_handler *handler, 17 struct dentry *dentry, const char *name, 18 void *buffer, size_t size) 19 { 20 return hfsplus_getxattr(dentry, name, buffer, size, 21 XATTR_SECURITY_PREFIX, 22 XATTR_SECURITY_PREFIX_LEN); 23 } 24 25 static int hfsplus_security_setxattr(const struct xattr_handler *handler, 26 struct dentry *dentry, const char *name, 27 const void *buffer, size_t size, int flags) 28 { 29 return hfsplus_setxattr(dentry, name, buffer, size, flags, 30 XATTR_SECURITY_PREFIX, 31 XATTR_SECURITY_PREFIX_LEN); 32 } 33 34 static int hfsplus_initxattrs(struct inode *inode, 35 const struct xattr *xattr_array, 36 void *fs_info) 37 { 38 const struct xattr *xattr; 39 char *xattr_name; 40 int err = 0; 41 42 xattr_name = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN + 1, 43 GFP_KERNEL); 44 if (!xattr_name) 45 return -ENOMEM; 46 for (xattr = xattr_array; xattr->name != NULL; xattr++) { 47 48 if (!strcmp(xattr->name, "")) 49 continue; 50 51 strcpy(xattr_name, XATTR_SECURITY_PREFIX); 52 strcpy(xattr_name + 53 XATTR_SECURITY_PREFIX_LEN, xattr->name); 54 memset(xattr_name + 55 XATTR_SECURITY_PREFIX_LEN + strlen(xattr->name), 0, 1); 56 57 err = __hfsplus_setxattr(inode, xattr_name, 58 xattr->value, xattr->value_len, 0); 59 if (err) 60 break; 61 } 62 kfree(xattr_name); 63 return err; 64 } 65 66 int hfsplus_init_security(struct inode *inode, struct inode *dir, 67 const struct qstr *qstr) 68 { 69 return security_inode_init_security(inode, dir, qstr, 70 &hfsplus_initxattrs, NULL); 71 } 72 73 int hfsplus_init_inode_security(struct inode *inode, 74 struct inode *dir, 75 const struct qstr *qstr) 76 { 77 int err; 78 79 err = hfsplus_init_posix_acl(inode, dir); 80 if (!err) 81 err = hfsplus_init_security(inode, dir, qstr); 82 return err; 83 } 84 85 const struct xattr_handler hfsplus_xattr_security_handler = { 86 .prefix = XATTR_SECURITY_PREFIX, 87 .get = hfsplus_security_getxattr, 88 .set = hfsplus_security_setxattr, 89 }; 90