1/* 2 * linux/fs/ext3/xattr_security.c 3 * Handler for storing security labels as extended attributes. 4 */ 5 6#include <linux/security.h> 7#include "ext3.h" 8#include "xattr.h" 9 10static size_t 11ext3_xattr_security_list(struct dentry *dentry, char *list, size_t list_size, 12 const char *name, size_t name_len, int type) 13{ 14 const size_t prefix_len = XATTR_SECURITY_PREFIX_LEN; 15 const size_t total_len = prefix_len + name_len + 1; 16 17 18 if (list && total_len <= list_size) { 19 memcpy(list, XATTR_SECURITY_PREFIX, prefix_len); 20 memcpy(list+prefix_len, name, name_len); 21 list[prefix_len + name_len] = '\0'; 22 } 23 return total_len; 24} 25 26static int 27ext3_xattr_security_get(struct dentry *dentry, const char *name, 28 void *buffer, size_t size, int type) 29{ 30 if (strcmp(name, "") == 0) 31 return -EINVAL; 32 return ext3_xattr_get(d_inode(dentry), EXT3_XATTR_INDEX_SECURITY, 33 name, buffer, size); 34} 35 36static int 37ext3_xattr_security_set(struct dentry *dentry, const char *name, 38 const void *value, size_t size, int flags, int type) 39{ 40 if (strcmp(name, "") == 0) 41 return -EINVAL; 42 return ext3_xattr_set(d_inode(dentry), EXT3_XATTR_INDEX_SECURITY, 43 name, value, size, flags); 44} 45 46static int ext3_initxattrs(struct inode *inode, 47 const struct xattr *xattr_array, 48 void *fs_info) 49{ 50 const struct xattr *xattr; 51 handle_t *handle = fs_info; 52 int err = 0; 53 54 for (xattr = xattr_array; xattr->name != NULL; xattr++) { 55 err = ext3_xattr_set_handle(handle, inode, 56 EXT3_XATTR_INDEX_SECURITY, 57 xattr->name, xattr->value, 58 xattr->value_len, 0); 59 if (err < 0) 60 break; 61 } 62 return err; 63} 64 65int 66ext3_init_security(handle_t *handle, struct inode *inode, struct inode *dir, 67 const struct qstr *qstr) 68{ 69 return security_inode_init_security(inode, dir, qstr, 70 &ext3_initxattrs, handle); 71} 72 73const struct xattr_handler ext3_xattr_security_handler = { 74 .prefix = XATTR_SECURITY_PREFIX, 75 .list = ext3_xattr_security_list, 76 .get = ext3_xattr_security_get, 77 .set = ext3_xattr_security_set, 78}; 79