cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

9p-posix-acl.c (4354B)


      1/*
      2 * 9p system.posix* xattr callback
      3 *
      4 * Copyright IBM, Corp. 2010
      5 *
      6 * Authors:
      7 * Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
      8 *
      9 * This work is licensed under the terms of the GNU GPL, version 2.  See
     10 * the COPYING file in the top-level directory.
     11 *
     12 */
     13
     14/*
     15 * Not so fast! You might want to read the 9p developer docs first:
     16 * https://wiki.qemu.org/Documentation/9p
     17 */
     18
     19#include "qemu/osdep.h"
     20#include "qemu/xattr.h"
     21#include "9p.h"
     22#include "fsdev/file-op-9p.h"
     23#include "9p-xattr.h"
     24
     25#define MAP_ACL_ACCESS "user.virtfs.system.posix_acl_access"
     26#define MAP_ACL_DEFAULT "user.virtfs.system.posix_acl_default"
     27#define ACL_ACCESS "system.posix_acl_access"
     28#define ACL_DEFAULT "system.posix_acl_default"
     29
     30static ssize_t mp_pacl_getxattr(FsContext *ctx, const char *path,
     31                                const char *name, void *value, size_t size)
     32{
     33    return local_getxattr_nofollow(ctx, path, MAP_ACL_ACCESS, value, size);
     34}
     35
     36static ssize_t mp_pacl_listxattr(FsContext *ctx, const char *path,
     37                                 char *name, void *value, size_t osize)
     38{
     39    ssize_t len = sizeof(ACL_ACCESS);
     40
     41    if (!value) {
     42        return len;
     43    }
     44
     45    if (osize < len) {
     46        errno = ERANGE;
     47        return -1;
     48    }
     49
     50    /* len includes the trailing NUL */
     51    memcpy(value, ACL_ACCESS, len);
     52    return 0;
     53}
     54
     55static int mp_pacl_setxattr(FsContext *ctx, const char *path, const char *name,
     56                            void *value, size_t size, int flags)
     57{
     58    return local_setxattr_nofollow(ctx, path, MAP_ACL_ACCESS, value, size,
     59                                   flags);
     60}
     61
     62static int mp_pacl_removexattr(FsContext *ctx,
     63                               const char *path, const char *name)
     64{
     65    int ret;
     66
     67    ret = local_removexattr_nofollow(ctx, path, MAP_ACL_ACCESS);
     68    if (ret == -1 && errno == ENODATA) {
     69        /*
     70         * We don't get ENODATA error when trying to remove a
     71         * posix acl that is not present. So don't throw the error
     72         * even in case of mapped security model
     73         */
     74        errno = 0;
     75        ret = 0;
     76    }
     77    return ret;
     78}
     79
     80static ssize_t mp_dacl_getxattr(FsContext *ctx, const char *path,
     81                                const char *name, void *value, size_t size)
     82{
     83    return local_getxattr_nofollow(ctx, path, MAP_ACL_DEFAULT, value, size);
     84}
     85
     86static ssize_t mp_dacl_listxattr(FsContext *ctx, const char *path,
     87                                 char *name, void *value, size_t osize)
     88{
     89    ssize_t len = sizeof(ACL_DEFAULT);
     90
     91    if (!value) {
     92        return len;
     93    }
     94
     95    if (osize < len) {
     96        errno = ERANGE;
     97        return -1;
     98    }
     99
    100    /* len includes the trailing NUL */
    101    memcpy(value, ACL_DEFAULT, len);
    102    return 0;
    103}
    104
    105static int mp_dacl_setxattr(FsContext *ctx, const char *path, const char *name,
    106                            void *value, size_t size, int flags)
    107{
    108    return local_setxattr_nofollow(ctx, path, MAP_ACL_DEFAULT, value, size,
    109                                   flags);
    110}
    111
    112static int mp_dacl_removexattr(FsContext *ctx,
    113                               const char *path, const char *name)
    114{
    115    int ret;
    116
    117    ret = local_removexattr_nofollow(ctx, path, MAP_ACL_DEFAULT);
    118    if (ret == -1 && errno == ENODATA) {
    119        /*
    120         * We don't get ENODATA error when trying to remove a
    121         * posix acl that is not present. So don't throw the error
    122         * even in case of mapped security model
    123         */
    124        errno = 0;
    125        ret = 0;
    126    }
    127    return ret;
    128}
    129
    130
    131XattrOperations mapped_pacl_xattr = {
    132    .name = "system.posix_acl_access",
    133    .getxattr = mp_pacl_getxattr,
    134    .setxattr = mp_pacl_setxattr,
    135    .listxattr = mp_pacl_listxattr,
    136    .removexattr = mp_pacl_removexattr,
    137};
    138
    139XattrOperations mapped_dacl_xattr = {
    140    .name = "system.posix_acl_default",
    141    .getxattr = mp_dacl_getxattr,
    142    .setxattr = mp_dacl_setxattr,
    143    .listxattr = mp_dacl_listxattr,
    144    .removexattr = mp_dacl_removexattr,
    145};
    146
    147XattrOperations passthrough_acl_xattr = {
    148    .name = "system.posix_acl_",
    149    .getxattr = pt_getxattr,
    150    .setxattr = pt_setxattr,
    151    .listxattr = pt_listxattr,
    152    .removexattr = pt_removexattr,
    153};
    154
    155XattrOperations none_acl_xattr = {
    156    .name = "system.posix_acl_",
    157    .getxattr = notsup_getxattr,
    158    .setxattr = notsup_setxattr,
    159    .listxattr = notsup_listxattr,
    160    .removexattr = notsup_removexattr,
    161};