1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * linux/fs/ext2/xattr_trusted.c 3*1da177e4SLinus Torvalds * Handler for trusted extended attributes. 4*1da177e4SLinus Torvalds * 5*1da177e4SLinus Torvalds * Copyright (C) 2003 by Andreas Gruenbacher, <a.gruenbacher@computer.org> 6*1da177e4SLinus Torvalds */ 7*1da177e4SLinus Torvalds 8*1da177e4SLinus Torvalds #include <linux/module.h> 9*1da177e4SLinus Torvalds #include <linux/string.h> 10*1da177e4SLinus Torvalds #include <linux/fs.h> 11*1da177e4SLinus Torvalds #include <linux/smp_lock.h> 12*1da177e4SLinus Torvalds #include <linux/ext2_fs.h> 13*1da177e4SLinus Torvalds #include "xattr.h" 14*1da177e4SLinus Torvalds 15*1da177e4SLinus Torvalds #define XATTR_TRUSTED_PREFIX "trusted." 16*1da177e4SLinus Torvalds 17*1da177e4SLinus Torvalds static size_t 18*1da177e4SLinus Torvalds ext2_xattr_trusted_list(struct inode *inode, char *list, size_t list_size, 19*1da177e4SLinus Torvalds const char *name, size_t name_len) 20*1da177e4SLinus Torvalds { 21*1da177e4SLinus Torvalds const int prefix_len = sizeof(XATTR_TRUSTED_PREFIX)-1; 22*1da177e4SLinus Torvalds const size_t total_len = prefix_len + name_len + 1; 23*1da177e4SLinus Torvalds 24*1da177e4SLinus Torvalds if (!capable(CAP_SYS_ADMIN)) 25*1da177e4SLinus Torvalds return 0; 26*1da177e4SLinus Torvalds 27*1da177e4SLinus Torvalds if (list && total_len <= list_size) { 28*1da177e4SLinus Torvalds memcpy(list, XATTR_TRUSTED_PREFIX, prefix_len); 29*1da177e4SLinus Torvalds memcpy(list+prefix_len, name, name_len); 30*1da177e4SLinus Torvalds list[prefix_len + name_len] = '\0'; 31*1da177e4SLinus Torvalds } 32*1da177e4SLinus Torvalds return total_len; 33*1da177e4SLinus Torvalds } 34*1da177e4SLinus Torvalds 35*1da177e4SLinus Torvalds static int 36*1da177e4SLinus Torvalds ext2_xattr_trusted_get(struct inode *inode, const char *name, 37*1da177e4SLinus Torvalds void *buffer, size_t size) 38*1da177e4SLinus Torvalds { 39*1da177e4SLinus Torvalds if (strcmp(name, "") == 0) 40*1da177e4SLinus Torvalds return -EINVAL; 41*1da177e4SLinus Torvalds if (!capable(CAP_SYS_ADMIN)) 42*1da177e4SLinus Torvalds return -EPERM; 43*1da177e4SLinus Torvalds return ext2_xattr_get(inode, EXT2_XATTR_INDEX_TRUSTED, name, 44*1da177e4SLinus Torvalds buffer, size); 45*1da177e4SLinus Torvalds } 46*1da177e4SLinus Torvalds 47*1da177e4SLinus Torvalds static int 48*1da177e4SLinus Torvalds ext2_xattr_trusted_set(struct inode *inode, const char *name, 49*1da177e4SLinus Torvalds const void *value, size_t size, int flags) 50*1da177e4SLinus Torvalds { 51*1da177e4SLinus Torvalds if (strcmp(name, "") == 0) 52*1da177e4SLinus Torvalds return -EINVAL; 53*1da177e4SLinus Torvalds if (!capable(CAP_SYS_ADMIN)) 54*1da177e4SLinus Torvalds return -EPERM; 55*1da177e4SLinus Torvalds return ext2_xattr_set(inode, EXT2_XATTR_INDEX_TRUSTED, name, 56*1da177e4SLinus Torvalds value, size, flags); 57*1da177e4SLinus Torvalds } 58*1da177e4SLinus Torvalds 59*1da177e4SLinus Torvalds struct xattr_handler ext2_xattr_trusted_handler = { 60*1da177e4SLinus Torvalds .prefix = XATTR_TRUSTED_PREFIX, 61*1da177e4SLinus Torvalds .list = ext2_xattr_trusted_list, 62*1da177e4SLinus Torvalds .get = ext2_xattr_trusted_get, 63*1da177e4SLinus Torvalds .set = ext2_xattr_trusted_set, 64*1da177e4SLinus Torvalds }; 65