11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/fs/ext2/xattr_trusted.c 31da177e4SLinus Torvalds * Handler for trusted extended attributes. 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 2003 by Andreas Gruenbacher, <a.gruenbacher@computer.org> 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds #include <linux/module.h> 91da177e4SLinus Torvalds #include <linux/string.h> 1016f7e0feSRandy Dunlap #include <linux/capability.h> 111da177e4SLinus Torvalds #include <linux/fs.h> 121da177e4SLinus Torvalds #include <linux/ext2_fs.h> 131da177e4SLinus Torvalds #include "xattr.h" 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds static size_t 16431547b3SChristoph Hellwig ext2_xattr_trusted_list(struct dentry *dentry, char *list, size_t list_size, 17431547b3SChristoph Hellwig const char *name, size_t name_len, int type) 181da177e4SLinus Torvalds { 19f905f06fSShen Feng const int prefix_len = XATTR_TRUSTED_PREFIX_LEN; 201da177e4SLinus Torvalds const size_t total_len = prefix_len + name_len + 1; 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds if (!capable(CAP_SYS_ADMIN)) 231da177e4SLinus Torvalds return 0; 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds if (list && total_len <= list_size) { 261da177e4SLinus Torvalds memcpy(list, XATTR_TRUSTED_PREFIX, prefix_len); 271da177e4SLinus Torvalds memcpy(list+prefix_len, name, name_len); 281da177e4SLinus Torvalds list[prefix_len + name_len] = '\0'; 291da177e4SLinus Torvalds } 301da177e4SLinus Torvalds return total_len; 311da177e4SLinus Torvalds } 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds static int 34431547b3SChristoph Hellwig ext2_xattr_trusted_get(struct dentry *dentry, const char *name, 35431547b3SChristoph Hellwig void *buffer, size_t size, int type) 361da177e4SLinus Torvalds { 371da177e4SLinus Torvalds if (strcmp(name, "") == 0) 381da177e4SLinus Torvalds return -EINVAL; 39431547b3SChristoph Hellwig return ext2_xattr_get(dentry->d_inode, EXT2_XATTR_INDEX_TRUSTED, name, 401da177e4SLinus Torvalds buffer, size); 411da177e4SLinus Torvalds } 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds static int 44431547b3SChristoph Hellwig ext2_xattr_trusted_set(struct dentry *dentry, const char *name, 45431547b3SChristoph Hellwig const void *value, size_t size, int flags, int type) 461da177e4SLinus Torvalds { 471da177e4SLinus Torvalds if (strcmp(name, "") == 0) 481da177e4SLinus Torvalds return -EINVAL; 49431547b3SChristoph Hellwig return ext2_xattr_set(dentry->d_inode, EXT2_XATTR_INDEX_TRUSTED, name, 501da177e4SLinus Torvalds value, size, flags); 511da177e4SLinus Torvalds } 521da177e4SLinus Torvalds 53*749c72efSStephen Hemminger const struct xattr_handler ext2_xattr_trusted_handler = { 541da177e4SLinus Torvalds .prefix = XATTR_TRUSTED_PREFIX, 551da177e4SLinus Torvalds .list = ext2_xattr_trusted_list, 561da177e4SLinus Torvalds .get = ext2_xattr_trusted_get, 571da177e4SLinus Torvalds .set = ext2_xattr_trusted_set, 581da177e4SLinus Torvalds }; 59