[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [V10 PATCH 13/13] virtio-9p: Chroot environment for other f
From: |
M. Mohan Kumar |
Subject: |
[Qemu-devel] [V10 PATCH 13/13] virtio-9p: Chroot environment for other functions |
Date: |
Thu, 31 Mar 2011 13:51:40 +0530 |
Add chroot functionality for systemcalls that can operate on a file
using relative directory file descriptor.
Signed-off-by: M. Mohan Kumar <address@hidden>
---
hw/9pfs/virtio-9p-local.c | 125 +++++++++++++++++++++++++++++++++++++++++----
1 files changed, 115 insertions(+), 10 deletions(-)
diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c
index def0c62..fa5c88f 100644
--- a/hw/9pfs/virtio-9p-local.c
+++ b/hw/9pfs/virtio-9p-local.c
@@ -22,6 +22,8 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <attr/xattr.h>
+#include <libgen.h>
+#include "qemu-error.h"
/* Helper routine to fill V9fsFileObjectRequest structure */
static int fill_fileobjectrequest(V9fsFileObjectRequest *request,
@@ -80,14 +82,42 @@ static int passthrough_request(FsContext *fs_ctx, const
char *old_path,
return retval;
}
+/*
+ * Returns file descriptor of dirname(path)
+ * This fd can be used by *at functions
+ */
+static int get_dirfd(FsContext *fs_ctx, const char *path)
+{
+ int fd;
+ char *dpath;
+ char *last_component;
+
+ /* path can not contain ".." */
+ last_component = strrchr(path, '/');
+ if (last_component && !strcmp(last_component, "/..")) {
+ error_report("9p path request contains \"..\": %s\n", path);
+ errno = EFAULT;
+ return -1;
+ }
+ dpath = qemu_strdup(path);
+ fd = passthrough_request(fs_ctx, NULL, dirname(dpath), 0, NULL, T_OPEN);
+ qemu_free(dpath);
+ if (fd < 0) {
+ errno = -fd;
+ fd = -1;
+ }
+ return fd;
+}
+
static int local_lstat(FsContext *fs_ctx, const char *path, struct stat *stbuf)
{
int err;
- err = lstat(rpath(fs_ctx, path), stbuf);
- if (err) {
- return err;
- }
+
if (fs_ctx->fs_sm == SM_MAPPED) {
+ err = lstat(rpath(fs_ctx, path), stbuf);
+ if (err) {
+ return err;
+ }
/* Actual credentials are part of extended attrs */
uid_t tmp_uid;
gid_t tmp_gid;
@@ -109,6 +139,26 @@ static int local_lstat(FsContext *fs_ctx, const char
*path, struct stat *stbuf)
sizeof(dev_t)) > 0) {
stbuf->st_rdev = tmp_dev;
}
+ } else if (fs_ctx->fs_sm == SM_PASSTHROUGH) {
+ int pfd, serrno = 0;
+ char *tmp_path;
+
+ pfd = get_dirfd(fs_ctx, path);
+ if (pfd < 0) {
+ return -1;
+ }
+ tmp_path = qemu_strdup(path);
+ err = fstatat(pfd, basename(tmp_path), stbuf, AT_SYMLINK_NOFOLLOW);
+ if (err < 0) {
+ serrno = errno;
+ }
+ close(pfd);
+ qemu_free(tmp_path);
+ if (err < 0) {
+ errno = serrno;
+ }
+ } else {
+ err = lstat(rpath(fs_ctx, path), stbuf);
}
return err;
}
@@ -173,9 +223,26 @@ static ssize_t local_readlink(FsContext *fs_ctx, const
char *path,
} while (tsize == -1 && errno == EINTR);
close(fd);
return tsize;
- } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) ||
- (fs_ctx->fs_sm == SM_NONE)) {
+ } else if (fs_ctx->fs_sm == SM_NONE) {
tsize = readlink(rpath(fs_ctx, path), buf, bufsz);
+ } else if (fs_ctx->fs_sm == SM_PASSTHROUGH) {
+ int pfd, serrno = 0;
+ char *tmp_path;
+ pfd = get_dirfd(fs_ctx, path);
+ if (pfd < 0) {
+ return -1;
+ }
+
+ tmp_path = qemu_strdup(path);
+ tsize = readlinkat(pfd, basename(tmp_path), buf, bufsz);
+ if (tsize < 0) {
+ serrno = errno;
+ }
+ close(pfd);
+ qemu_free(tmp_path);
+ if (tsize < 0) {
+ errno = serrno;
+ }
}
return tsize;
}
@@ -501,7 +568,25 @@ static int local_link(FsContext *fs_ctx, const char
*oldpath,
static int local_truncate(FsContext *ctx, const char *path, off_t size)
{
- return truncate(rpath(ctx, path), size);
+ if (ctx->fs_sm == SM_PASSTHROUGH) {
+ int fd, retval, serrno;
+ fd = passthrough_request(ctx, NULL, path, O_RDWR, NULL, T_OPEN);
+ if (fd < 0) {
+ errno = -fd;
+ return -1;
+ }
+ retval = ftruncate(fd, size);
+ if (retval < 0) {
+ serrno = errno;
+ }
+ close(fd);
+ if (retval < 0) {
+ errno = serrno;
+ }
+ return retval;
+ } else {
+ return truncate(rpath(ctx, path), size);
+ }
}
static int local_rename(FsContext *ctx, const char *oldpath,
@@ -541,10 +626,30 @@ static int local_chown(FsContext *fs_ctx, const char
*path, FsCred *credp)
return -1;
}
-static int local_utimensat(FsContext *s, const char *path,
- const struct timespec *buf)
+static int local_utimensat(FsContext *fs_ctx, const char *path,
+ const struct timespec *buf)
{
- return qemu_utimensat(AT_FDCWD, rpath(s, path), buf, AT_SYMLINK_NOFOLLOW);
+ if (fs_ctx->fs_sm == SM_PASSTHROUGH) {
+ int fd, retval, serrno = 0;
+ fd = passthrough_request(fs_ctx, NULL, path,
+ O_RDONLY | O_NONBLOCK | O_NOFOLLOW, NULL, T_OPEN);
+ if (fd < 0) {
+ errno = -fd;
+ return -1;
+ }
+ retval = futimens(fd, buf);
+ if (retval < 0) {
+ serrno = errno;
+ }
+ close(fd);
+ if (retval < 0) {
+ errno = serrno;
+ }
+ return retval;
+ } else {
+ return utimensat(AT_FDCWD, rpath(fs_ctx, path), buf,
+ AT_SYMLINK_NOFOLLOW);
+ }
}
static int local_remove(FsContext *ctx, const char *path)
--
1.7.4
- [Qemu-devel] [V10 PATCH 03/13] virtio-9p: Provide chroot worker side interfaces, (continued)
- [Qemu-devel] [V10 PATCH 03/13] virtio-9p: Provide chroot worker side interfaces, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 06/13] virtio-9p: Create support in chroot environment, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 05/13] virtio-9p: Add support to open a file in chroot environment, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 08/13] virtio-9p: Add support for removing file or directory, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 10/13] virtio-9p: Move file post creation changes to none security model, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 01/13] Implement qemu_read_full, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 09/13] virtio-9p: Add support to rename, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 11/13] virtio-9p: Add support for chmod, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 04/13] virtio-9p: Add qemu side interfaces for chroot environment, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 02/13] virtio-9p: Enable CONFIG_THREAD if CONFIG_VIRTFS is enabled, M. Mohan Kumar, 2011/03/31
- [Qemu-devel] [V10 PATCH 13/13] virtio-9p: Chroot environment for other functions,
M. Mohan Kumar <=