1 /* 2 * 9p user. 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 #include "qemu/osdep.h" 15 #include "9p.h" 16 #include "fsdev/file-op-9p.h" 17 #include "9p-xattr.h" 18 19 20 static ssize_t mp_user_getxattr(FsContext *ctx, const char *path, 21 const char *name, void *value, size_t size) 22 { 23 if (strncmp(name, "user.virtfs.", 12) == 0) { 24 /* 25 * Don't allow fetch of user.virtfs namesapce 26 * in case of mapped security 27 */ 28 errno = ENOATTR; 29 return -1; 30 } 31 return local_getxattr_nofollow(ctx, path, name, value, size); 32 } 33 34 static ssize_t mp_user_listxattr(FsContext *ctx, const char *path, 35 char *name, void *value, size_t size) 36 { 37 int name_size = strlen(name) + 1; 38 if (strncmp(name, "user.virtfs.", 12) == 0) { 39 40 /* check if it is a mapped posix acl */ 41 if (strncmp(name, "user.virtfs.system.posix_acl_", 29) == 0) { 42 /* adjust the name and size */ 43 name += 12; 44 name_size -= 12; 45 } else { 46 /* 47 * Don't allow fetch of user.virtfs namesapce 48 * in case of mapped security 49 */ 50 return 0; 51 } 52 } 53 if (!value) { 54 return name_size; 55 } 56 57 if (size < name_size) { 58 errno = ERANGE; 59 return -1; 60 } 61 62 /* name_size includes the trailing NUL. */ 63 memcpy(value, name, name_size); 64 return name_size; 65 } 66 67 static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name, 68 void *value, size_t size, int flags) 69 { 70 if (strncmp(name, "user.virtfs.", 12) == 0) { 71 /* 72 * Don't allow fetch of user.virtfs namesapce 73 * in case of mapped security 74 */ 75 errno = EACCES; 76 return -1; 77 } 78 return local_setxattr_nofollow(ctx, path, name, value, size, flags); 79 } 80 81 static int mp_user_removexattr(FsContext *ctx, 82 const char *path, const char *name) 83 { 84 if (strncmp(name, "user.virtfs.", 12) == 0) { 85 /* 86 * Don't allow fetch of user.virtfs namesapce 87 * in case of mapped security 88 */ 89 errno = EACCES; 90 return -1; 91 } 92 return local_removexattr_nofollow(ctx, path, name); 93 } 94 95 XattrOperations mapped_user_xattr = { 96 .name = "user.", 97 .getxattr = mp_user_getxattr, 98 .setxattr = mp_user_setxattr, 99 .listxattr = mp_user_listxattr, 100 .removexattr = mp_user_removexattr, 101 }; 102 103 XattrOperations passthrough_user_xattr = { 104 .name = "user.", 105 .getxattr = pt_getxattr, 106 .setxattr = pt_setxattr, 107 .listxattr = pt_listxattr, 108 .removexattr = pt_removexattr, 109 }; 110