virtio-9p: Add support for removing xattr
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Thu, 26 Aug 2010 05:45:23 +0000 (11:15 +0530)
committerAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Wed, 8 Sep 2010 17:26:42 +0000 (22:56 +0530)
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
hw/file-op-9p.h
hw/virtio-9p-local.c
hw/virtio-9p.c

index 017183d..d91b7e7 100644 (file)
@@ -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
index 132816e..57f9243 100644 (file)
@@ -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,
 };
index a53b222..eb7ae01 100644 (file)
@@ -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);