xref: /openbmc/linux/fs/ext2/xattr_trusted.c (revision 749c72efa4bd91dad3a8c2ac8bfaa7c45490ceef)
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