From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=43741 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OrFTO-0004Mc-SA for qemu-devel@nongnu.org; Thu, 02 Sep 2010 15:29:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OrFTN-0004hj-84 for qemu-devel@nongnu.org; Thu, 02 Sep 2010 15:29:22 -0400 Received: from e32.co.us.ibm.com ([32.97.110.150]:41252) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OrFTN-0004hV-2N for qemu-devel@nongnu.org; Thu, 02 Sep 2010 15:29:21 -0400 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e32.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id o82JKt9w020457 for ; Thu, 2 Sep 2010 13:20:55 -0600 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o82JTKG9060144 for ; Thu, 2 Sep 2010 13:29:20 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id o82JTJGS022294 for ; Thu, 2 Sep 2010 13:29:20 -0600 From: "Venkateswararao Jujjuri (JV)" Date: Thu, 2 Sep 2010 12:39:44 -0700 Message-Id: <1283456388-13083-25-git-send-email-jvrao@linux.vnet.ibm.com> In-Reply-To: <1283456388-13083-1-git-send-email-jvrao@linux.vnet.ibm.com> References: <1283456388-13083-1-git-send-email-jvrao@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH -V5 24/28] virtio-9p: Add support for removing xattr List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, Venkateswararao Jujjuri , "Aneesh Kumar K.V" From: Aneesh Kumar K.V Signed-off-by: Aneesh Kumar K.V Signed-off-by: Venkateswararao Jujjuri --- hw/file-op-9p.h | 1 + hw/virtio-9p-local.c | 17 +++++++++++++++++ hw/virtio-9p.c | 25 ++++++++++++++++++++----- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/hw/file-op-9p.h b/hw/file-op-9p.h index 017183d..d91b7e7 100644 --- a/hw/file-op-9p.h +++ b/hw/file-op-9p.h @@ -91,6 +91,7 @@ typedef struct FileOperations ssize_t (*llistxattr)(FsContext *, const char *, void *, size_t); int (*lsetxattr)(FsContext *, const char *, const char *, void *, size_t, int); + int (*lremovexattr)(FsContext *, const char *, const char *); void *opaque; } FileOperations; #endif diff --git a/hw/virtio-9p-local.c b/hw/virtio-9p-local.c index 132816e..57f9243 100644 --- a/hw/virtio-9p-local.c +++ b/hw/virtio-9p-local.c @@ -581,6 +581,22 @@ static int local_lsetxattr(FsContext *ctx, const char *path, const char *name, return lsetxattr(rpath(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); +} + + FileOperations local_ops = { .lstat = local_lstat, .readlink = local_readlink, @@ -612,4 +628,5 @@ FileOperations local_ops = { .lgetxattr = local_lgetxattr, .llistxattr = local_llistxattr, .lsetxattr = local_lsetxattr, + .lremovexattr = local_lremovexattr, }; diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c index a53b222..eb7ae01 100644 --- a/hw/virtio-9p.c +++ b/hw/virtio-9p.c @@ -286,6 +286,14 @@ static int v9fs_do_lsetxattr(V9fsState *s, V9fsString *path, xattr_name->data, value, size, flags); } +static int v9fs_do_lremovexattr(V9fsState *s, V9fsString *path, + V9fsString *xattr_name) +{ + return s->ops->lremovexattr(&s->ctx, path->data, + xattr_name->data); +} + + static void v9fs_string_init(V9fsString *str) { str->data = NULL; @@ -456,10 +464,14 @@ static int v9fs_xattr_fid_clunk(V9fsState *s, V9fsFidState *fidp) retval = -EINVAL; goto free_out; } - retval = v9fs_do_lsetxattr(s, &fidp->path, &fidp->fs.xattr.name, - fidp->fs.xattr.value, - fidp->fs.xattr.len, - fidp->fs.xattr.flags); + if (fidp->fs.xattr.len) { + retval = v9fs_do_lsetxattr(s, &fidp->path, &fidp->fs.xattr.name, + fidp->fs.xattr.value, + fidp->fs.xattr.len, + fidp->fs.xattr.flags); + } else { + retval = v9fs_do_lremovexattr(s, &fidp->path, &fidp->fs.xattr.name); + } free_out: v9fs_string_free(&fidp->fs.xattr.name); free_value: @@ -3392,7 +3404,10 @@ static void v9fs_xattrcreate(V9fsState *s, V9fsPDU *pdu) vs->xattr_fidp->fs.xattr.flags = flags; v9fs_string_init(&vs->xattr_fidp->fs.xattr.name); v9fs_string_copy(&vs->xattr_fidp->fs.xattr.name, &vs->name); - vs->xattr_fidp->fs.xattr.value = qemu_malloc(vs->size); + if (vs->size) + vs->xattr_fidp->fs.xattr.value = qemu_malloc(vs->size); + else + vs->xattr_fidp->fs.xattr.value = NULL; out: complete_pdu(s, vs->pdu, err); -- 1.6.5.2