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