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 char *buffer; 24 ssize_t ret; 25 26 if (strncmp(name, "user.virtfs.", 12) == 0) { 27 /* 28 * Don't allow fetch of user.virtfs namesapce 29 * in case of mapped security 30 */ 31 errno = ENOATTR; 32 return -1; 33 } 34 buffer = rpath(ctx, path); 35 ret = lgetxattr(buffer, name, value, size); 36 g_free(buffer); 37 return ret; 38 } 39 40 static ssize_t mp_user_listxattr(FsContext *ctx, const char *path, 41 char *name, void *value, size_t size) 42 { 43 int name_size = strlen(name) + 1; 44 if (strncmp(name, "user.virtfs.", 12) == 0) { 45 46 /* check if it is a mapped posix acl */ 47 if (strncmp(name, "user.virtfs.system.posix_acl_", 29) == 0) { 48 /* adjust the name and size */ 49 name += 12; 50 name_size -= 12; 51 } else { 52 /* 53 * Don't allow fetch of user.virtfs namesapce 54 * in case of mapped security 55 */ 56 return 0; 57 } 58 } 59 if (!value) { 60 return name_size; 61 } 62 63 if (size < name_size) { 64 errno = ERANGE; 65 return -1; 66 } 67 68 /* name_size includes the trailing NUL. */ 69 memcpy(value, name, name_size); 70 return name_size; 71 } 72 73 static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name, 74 void *value, size_t size, int flags) 75 { 76 char *buffer; 77 int ret; 78 79 if (strncmp(name, "user.virtfs.", 12) == 0) { 80 /* 81 * Don't allow fetch of user.virtfs namesapce 82 * in case of mapped security 83 */ 84 errno = EACCES; 85 return -1; 86 } 87 buffer = rpath(ctx, path); 88 ret = lsetxattr(buffer, name, value, size, flags); 89 g_free(buffer); 90 return ret; 91 } 92 93 static int mp_user_removexattr(FsContext *ctx, 94 const char *path, const char *name) 95 { 96 char *buffer; 97 int ret; 98 99 if (strncmp(name, "user.virtfs.", 12) == 0) { 100 /* 101 * Don't allow fetch of user.virtfs namesapce 102 * in case of mapped security 103 */ 104 errno = EACCES; 105 return -1; 106 } 107 buffer = rpath(ctx, path); 108 ret = lremovexattr(buffer, name); 109 g_free(buffer); 110 return ret; 111 } 112 113 XattrOperations mapped_user_xattr = { 114 .name = "user.", 115 .getxattr = mp_user_getxattr, 116 .setxattr = mp_user_setxattr, 117 .listxattr = mp_user_listxattr, 118 .removexattr = mp_user_removexattr, 119 }; 120 121 XattrOperations passthrough_user_xattr = { 122 .name = "user.", 123 .getxattr = pt_getxattr, 124 .setxattr = pt_setxattr, 125 .listxattr = pt_listxattr, 126 .removexattr = pt_removexattr, 127 }; 128