|
|
1.1 ! root 1: /* ! 2: * Virtio 9p user. xattr callback ! 3: * ! 4: * Copyright IBM, Corp. 2010 ! 5: * ! 6: * Authors: ! 7: * Aneesh Kumar K.V <[email protected]> ! 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: #include <sys/types.h> ! 15: #include "hw/virtio.h" ! 16: #include "virtio-9p.h" ! 17: #include "fsdev/file-op-9p.h" ! 18: #include "virtio-9p-xattr.h" ! 19: ! 20: ! 21: static ssize_t mp_user_getxattr(FsContext *ctx, const char *path, ! 22: const char *name, void *value, size_t size) ! 23: { ! 24: char buffer[PATH_MAX]; ! 25: if (strncmp(name, "user.virtfs.", 12) == 0) { ! 26: /* ! 27: * Don't allow fetch of user.virtfs namesapce ! 28: * in case of mapped security ! 29: */ ! 30: errno = ENOATTR; ! 31: return -1; ! 32: } ! 33: return lgetxattr(rpath(ctx, path, buffer), name, value, size); ! 34: } ! 35: ! 36: static ssize_t mp_user_listxattr(FsContext *ctx, const char *path, ! 37: char *name, void *value, size_t size) ! 38: { ! 39: int name_size = strlen(name) + 1; ! 40: if (strncmp(name, "user.virtfs.", 12) == 0) { ! 41: ! 42: /* check if it is a mapped posix acl */ ! 43: if (strncmp(name, "user.virtfs.system.posix_acl_", 29) == 0) { ! 44: /* adjust the name and size */ ! 45: name += 12; ! 46: name_size -= 12; ! 47: } else { ! 48: /* ! 49: * Don't allow fetch of user.virtfs namesapce ! 50: * in case of mapped security ! 51: */ ! 52: return 0; ! 53: } ! 54: } ! 55: if (!value) { ! 56: return name_size; ! 57: } ! 58: ! 59: if (size < name_size) { ! 60: errno = ERANGE; ! 61: return -1; ! 62: } ! 63: ! 64: strncpy(value, name, name_size); ! 65: return name_size; ! 66: } ! 67: ! 68: static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name, ! 69: void *value, size_t size, int flags) ! 70: { ! 71: char buffer[PATH_MAX]; ! 72: if (strncmp(name, "user.virtfs.", 12) == 0) { ! 73: /* ! 74: * Don't allow fetch of user.virtfs namesapce ! 75: * in case of mapped security ! 76: */ ! 77: errno = EACCES; ! 78: return -1; ! 79: } ! 80: return lsetxattr(rpath(ctx, path, buffer), name, value, size, flags); ! 81: } ! 82: ! 83: static int mp_user_removexattr(FsContext *ctx, ! 84: const char *path, const char *name) ! 85: { ! 86: char buffer[PATH_MAX]; ! 87: if (strncmp(name, "user.virtfs.", 12) == 0) { ! 88: /* ! 89: * Don't allow fetch of user.virtfs namesapce ! 90: * in case of mapped security ! 91: */ ! 92: errno = EACCES; ! 93: return -1; ! 94: } ! 95: return lremovexattr(rpath(ctx, path, buffer), name); ! 96: } ! 97: ! 98: XattrOperations mapped_user_xattr = { ! 99: .name = "user.", ! 100: .getxattr = mp_user_getxattr, ! 101: .setxattr = mp_user_setxattr, ! 102: .listxattr = mp_user_listxattr, ! 103: .removexattr = mp_user_removexattr, ! 104: }; ! 105: ! 106: XattrOperations passthrough_user_xattr = { ! 107: .name = "user.", ! 108: .getxattr = pt_getxattr, ! 109: .setxattr = pt_setxattr, ! 110: .listxattr = pt_listxattr, ! 111: .removexattr = pt_removexattr, ! 112: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.