diff options
Diffstat (limited to 'hw/virtio-9p-local.c')
-rw-r--r-- | hw/virtio-9p-local.c | 95 |
1 files changed, 5 insertions, 90 deletions
diff --git a/hw/virtio-9p-local.c b/hw/virtio-9p-local.c index 57f92433d3..ee630334b8 100644 --- a/hw/virtio-9p-local.c +++ b/hw/virtio-9p-local.c @@ -12,6 +12,7 @@ */ #include "virtio.h" #include "virtio-9p.h" +#include "virtio-9p-xattr.h" #include <arpa/inet.h> #include <pwd.h> #include <grp.h> @@ -19,14 +20,6 @@ #include <sys/un.h> #include <attr/xattr.h> -static const char *rpath(FsContext *ctx, const char *path) -{ - /* FIXME: so wrong... */ - static char buffer[4096]; - snprintf(buffer, sizeof(buffer), "%s/%s", ctx->fs_root, path); - return buffer; -} - static int local_lstat(FsContext *fs_ctx, const char *path, struct stat *stbuf) { @@ -497,103 +490,25 @@ static int local_statfs(FsContext *s, const char *path, struct statfs *stbuf) static ssize_t local_lgetxattr(FsContext *ctx, const char *path, const char *name, void *value, size_t size) { - if ((ctx->fs_sm == SM_MAPPED) && - (strncmp(name, "user.virtfs.", 12) == 0)) { - /* - * Don't allow fetch of user.virtfs namesapce - * in case of mapped security - */ - errno = ENOATTR; - return -1; - } - - return lgetxattr(rpath(ctx, path), name, value, size); + return v9fs_get_xattr(ctx, path, name, value, size); } static ssize_t local_llistxattr(FsContext *ctx, const char *path, void *value, size_t size) { - ssize_t retval; - ssize_t actual_len = 0; - char *orig_value, *orig_value_start; - char *temp_value, *temp_value_start; - ssize_t xattr_len, parsed_len = 0, attr_len; - - if (ctx->fs_sm != SM_MAPPED) { - return llistxattr(rpath(ctx, path), value, size); - } - - /* Get the actual len */ - xattr_len = llistxattr(rpath(ctx, path), value, 0); - - /* Now fetch the xattr and find the actual size */ - orig_value = qemu_malloc(xattr_len); - xattr_len = llistxattr(rpath(ctx, path), orig_value, xattr_len); - - /* - * For mapped security model drop user.virtfs namespace - * from the list - */ - temp_value = qemu_mallocz(xattr_len); - temp_value_start = temp_value; - orig_value_start = orig_value; - while (xattr_len > parsed_len) { - attr_len = strlen(orig_value) + 1; - if (strncmp(orig_value, "user.virtfs.", 12) != 0) { - /* Copy this entry */ - strcat(temp_value, orig_value); - temp_value += attr_len; - actual_len += attr_len; - } - parsed_len += attr_len; - orig_value += attr_len; - } - if (!size) { - retval = actual_len; - goto out; - } else if (size >= actual_len) { - /* now copy the parsed attribute list back */ - memset(value, 0, size); - memcpy(value, temp_value_start, actual_len); - retval = actual_len; - goto out; - } - errno = ERANGE; - retval = -1; -out: - qemu_free(orig_value_start); - qemu_free(temp_value_start); - return retval; + return v9fs_list_xattr(ctx, path, value, size); } static int local_lsetxattr(FsContext *ctx, const char *path, const char *name, void *value, size_t size, int flags) { - if ((ctx->fs_sm == SM_MAPPED) && - (strncmp(name, "user.virtfs.", 12) == 0)) { - /* - * Don't allow fetch of user.virtfs namesapce - * in case of mapped security - */ - errno = EACCES; - return -1; - } - return lsetxattr(rpath(ctx, path), name, value, size, flags); + return v9fs_set_xattr(ctx, path, name, value, size, flags); } static int local_lremovexattr(FsContext *ctx, const char *path, const char *name) { - if ((ctx->fs_sm == SM_MAPPED) && - (strncmp(name, "user.virtfs.", 12) == 0)) { - /* - * Don't allow fetch of user.virtfs namesapce - * in case of mapped security - */ - errno = EACCES; - return -1; - } - return lremovexattr(rpath(ctx, path), name); + return v9fs_remove_xattr(ctx, path, name); } |