summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVenkateswararao Jujjuri (JV) <jvrao@linux.vnet.ibm.com>2010-06-14 13:34:43 -0700
committerAnthony Liguori <aliguori@us.ibm.com>2010-06-22 15:15:50 -0500
commitf7613bee32ebd13ff4a8d721a59cf27b1fe5d94b (patch)
treeb962e63109eb5776f8d1887ee74a73043c4ca8bc
parente95ead32efc48157de12e0a257ea1c52541a6ce1 (diff)
downloadqemu-f7613bee32ebd13ff4a8d721a59cf27b1fe5d94b.tar.gz
virtio-9p: Security model for chown
mapped model changes the owner in the extended attributes. passthrough model does the change through lchown() as the server don't need to follow the link and client will send the actual filesystem object. Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--hw/file-op-9p.h2
-rw-r--r--hw/virtio-9p-local.c9
-rw-r--r--hw/virtio-9p.c9
3 files changed, 15 insertions, 5 deletions
diff --git a/hw/file-op-9p.h b/hw/file-op-9p.h
index 1c8d89b597..a53cd35094 100644
--- a/hw/file-op-9p.h
+++ b/hw/file-op-9p.h
@@ -50,7 +50,7 @@ typedef struct FileOperations
int (*lstat)(FsContext *, const char *, struct stat *);
ssize_t (*readlink)(FsContext *, const char *, char *, size_t);
int (*chmod)(FsContext *, const char *, FsCred *);
- int (*chown)(FsContext *, const char *, uid_t, gid_t);
+ int (*chown)(FsContext *, const char *, FsCred *);
int (*mknod)(FsContext *, const char *, mode_t, dev_t);
int (*mksock)(FsContext *, const char *);
int (*utime)(FsContext *, const char *, const struct utimbuf *);
diff --git a/hw/virtio-9p-local.c b/hw/virtio-9p-local.c
index 9bdcf02b72..1d7cb32411 100644
--- a/hw/virtio-9p-local.c
+++ b/hw/virtio-9p-local.c
@@ -240,9 +240,14 @@ static int local_rename(FsContext *ctx, const char *oldpath,
}
-static int local_chown(FsContext *ctx, const char *path, uid_t uid, gid_t gid)
+static int local_chown(FsContext *fs_ctx, const char *path, FsCred *credp)
{
- return chown(rpath(ctx, path), uid, gid);
+ if (fs_ctx->fs_sm == SM_MAPPED) {
+ return local_set_xattr(rpath(fs_ctx, path), credp);
+ } else if (fs_ctx->fs_sm == SM_PASSTHROUGH) {
+ return lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid);
+ }
+ return -1;
}
static int local_utime(FsContext *ctx, const char *path,
diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c
index 24291f4860..fa459c9260 100644
--- a/hw/virtio-9p.c
+++ b/hw/virtio-9p.c
@@ -209,7 +209,12 @@ static int v9fs_do_rename(V9fsState *s, V9fsString *oldpath,
static int v9fs_do_chown(V9fsState *s, V9fsString *path, uid_t uid, gid_t gid)
{
- return s->ops->chown(&s->ctx, path->data, uid, gid);
+ FsCred cred;
+ cred_init(&cred);
+ cred.fc_uid = uid;
+ cred.fc_gid = gid;
+
+ return s->ops->chown(&s->ctx, path->data, &cred);
}
static int v9fs_do_utime(V9fsState *s, V9fsString *path,
@@ -2014,7 +2019,7 @@ static void v9fs_wstat_post_utime(V9fsState *s, V9fsWstatState *vs, int err)
goto out;
}
- if (vs->v9stat.n_gid != -1) {
+ if (vs->v9stat.n_gid != -1 || vs->v9stat.n_uid != -1) {
if (v9fs_do_chown(s, &vs->fidp->path, vs->v9stat.n_uid,
vs->v9stat.n_gid)) {
err = -errno;