linux/fs/reiserfs/xattr_trusted.c
<<
>>
Prefs
   1#include "reiserfs.h"
   2#include <linux/capability.h>
   3#include <linux/errno.h>
   4#include <linux/fs.h>
   5#include <linux/pagemap.h>
   6#include <linux/xattr.h>
   7#include "xattr.h"
   8#include <asm/uaccess.h>
   9
  10static int
  11trusted_get(struct dentry *dentry, const char *name, void *buffer, size_t size,
  12            int handler_flags)
  13{
  14        if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
  15                return -EINVAL;
  16
  17        if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(dentry->d_inode))
  18                return -EPERM;
  19
  20        return reiserfs_xattr_get(dentry->d_inode, name, buffer, size);
  21}
  22
  23static int
  24trusted_set(struct dentry *dentry, const char *name, const void *buffer,
  25            size_t size, int flags, int handler_flags)
  26{
  27        if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
  28                return -EINVAL;
  29
  30        if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(dentry->d_inode))
  31                return -EPERM;
  32
  33        return reiserfs_xattr_set(dentry->d_inode, name, buffer, size, flags);
  34}
  35
  36static size_t trusted_list(struct dentry *dentry, char *list, size_t list_size,
  37                           const char *name, size_t name_len, int handler_flags)
  38{
  39        const size_t len = name_len + 1;
  40
  41        if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(dentry->d_inode))
  42                return 0;
  43
  44        if (list && len <= list_size) {
  45                memcpy(list, name, name_len);
  46                list[name_len] = '\0';
  47        }
  48        return len;
  49}
  50
  51const struct xattr_handler reiserfs_xattr_trusted_handler = {
  52        .prefix = XATTR_TRUSTED_PREFIX,
  53        .get = trusted_get,
  54        .set = trusted_set,
  55        .list = trusted_list,
  56};
  57