[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [V3 PATCH 6/8] virtio-9p: Support for creating special
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [V3 PATCH 6/8] virtio-9p: Support for creating special files |
Date: |
Tue, 18 Jan 2011 17:11:45 +0000 |
On Tue, Jan 18, 2011 at 6:26 AM, M. Mohan Kumar <address@hidden> wrote:
> Add both server and client side interfaces to create special files
> (directory, device nodes, links and symbolic links)
>
> Signed-off-by: M. Mohan Kumar <address@hidden>
> ---
> hw/9pfs/virtio-9p-chroot.c | 84 ++++++++++++++++++++++++++-
> hw/9pfs/virtio-9p-chroot.h | 2 +
> hw/9pfs/virtio-9p-local.c | 141
> ++++++++++++++++++++++++++++++++++----------
> 3 files changed, 195 insertions(+), 32 deletions(-)
>
> diff --git a/hw/9pfs/virtio-9p-chroot.c b/hw/9pfs/virtio-9p-chroot.c
> index e7f85e2..92a4917 100644
> --- a/hw/9pfs/virtio-9p-chroot.c
> +++ b/hw/9pfs/virtio-9p-chroot.c
> @@ -193,6 +193,29 @@ static void chroot_do_open(V9fsFileObjectRequest
> *request, FdInfo *fd_info)
> }
> }
>
> +int v9fs_create_special(FsContext *fs_ctx,
> + V9fsFileObjectRequest *request, int *error)
> +{
> + int retval;
> +
> + pthread_mutex_lock(&fs_ctx->chroot_mutex);
> +
> + *error = 0;
> + v9fs_write_request(fs_ctx->chroot_socket, request);
> + retval = qemu_read_full(fs_ctx->chroot_socket, error, sizeof(*error));
> + if (retval != sizeof(*error)) {
> + error_report("reading from socket failed: %s", strerror(errno));
> + exit(1);
> + }
> +
> + pthread_mutex_unlock(&fs_ctx->chroot_mutex);
> + if (*error) {
> + return -1;
> + } else {
> + return 0;
> + }
> +}
> +
> /*
> * Helper routine to create a file and return the file descriptor and
> * error status in FdInfo structure.
> @@ -229,6 +252,56 @@ unset_uid:
> setfsuid(cur_uid);
> }
>
> +/*
> + * Create directory, symbolic link, link, device node and regular files
> + * Similar to create, but it does not return the fd of created object
> + * Returns 0 on success, returns errno on failure
> + */
> +static int chroot_do_create_special(V9fsFileObjectRequest *request)
> +{
> + int cur_uid, cur_gid;
uid_t cur_uid;
gid_t cur_gid;
> + int retval, error;
> +
> + cur_uid = geteuid();
> + cur_gid = getegid();
> +
> + if (setfsuid(request->data.uid) < 0) {
> + return errno;
> + }
> + if (setfsgid(request->data.gid) < 0) {
> + error = errno;
> + goto unset_uid;
> + }
> +
> + switch (request->data.type) {
> + case T_MKDIR:
> + retval = mkdir(request->path.path, request->data.mode);
> + break;
> + case T_SYMLINK:
> + retval = symlink(request->path.old_path, request->path.path);
> + break;
> + case T_LINK:
> + retval = link(request->path.old_path, request->path.path);
> + break;
> + default:
> + retval = mknod(request->path.path, request->data.mode,
> + request->data.dev);
> + break;
> + }
> +
> + if (retval < 0) {
> + error = errno;
> + } else {
> + error = 0;
> + }
> +
> + setfsgid(cur_gid);
> +unset_uid:
> + setfsuid(cur_uid);
> +
> + return error;
> +}
> +
> static int chroot_daemonize(int chroot_sock)
> {
> sigset_t sigset;
> @@ -263,7 +336,7 @@ static int chroot_daemonize(int chroot_sock)
> */
> int v9fs_chroot(FsContext *fs_ctx)
> {
> - int fd_pair[2], pid, chroot_sock, error;
> + int fd_pair[2], pid, chroot_sock, error, retval;
> V9fsFileObjectRequest request;
> FdInfo fd_info;
>
> @@ -318,6 +391,15 @@ int v9fs_chroot(FsContext *fs_ctx)
> error = -2;
> }
> break;
> + case T_MKDIR:
> + case T_SYMLINK:
> + case T_LINK:
> + case T_MKNOD:
> + retval = chroot_do_create_special(&request);
> + if (qemu_write_full(chroot_sock, &retval, sizeof(retval)) < 0) {
> + error = -2;
> + }
> + break;
> default:
> break;
> }
> diff --git a/hw/9pfs/virtio-9p-chroot.h b/hw/9pfs/virtio-9p-chroot.h
> index f5a2ca0..9a0ba88 100644
> --- a/hw/9pfs/virtio-9p-chroot.h
> +++ b/hw/9pfs/virtio-9p-chroot.h
> @@ -36,5 +36,7 @@ typedef struct V9fsFileObjectRequest
>
> int v9fs_chroot(FsContext *fs_ctx);
> int v9fs_request(FsContext *fs_ctx, V9fsFileObjectRequest *or, int *error);
> +int v9fs_create_special(FsContext *fs_ctx,
> + V9fsFileObjectRequest *request, int *error);
>
> #endif /* _QEMU_VIRTIO_9P_CHROOT_H */
> diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c
> index 7f39b40..08fd67f 100644
> --- a/hw/9pfs/virtio-9p-local.c
> +++ b/hw/9pfs/virtio-9p-local.c
> @@ -69,6 +69,78 @@ static int __create(FsContext *fs_ctx, const char *path,
> int flags,
> return fd;
> }
>
> +static int __mknod(FsContext *fs_ctx, const char *path, FsCred *credp)
underscores
- [Qemu-devel] [V3 PATCH 0/8] virtio-9p: Use chroot to safely access files in passthrough model, M. Mohan Kumar, 2011/01/18
- [Qemu-devel] [V3 PATCH 1/8] virtio-9p: Implement qemu_read_full, M. Mohan Kumar, 2011/01/18
- [Qemu-devel] [V3 PATCH 2/8] virtio-9p: Provide chroot environment server side interfaces, M. Mohan Kumar, 2011/01/18
- [Qemu-devel] [V3 PATCH 3/8] virtio-9p: Add client side interfaces for chroot environment, M. Mohan Kumar, 2011/01/18
- [Qemu-devel] [V3 PATCH 4/8] virtio-9p: Add support to open a file in chroot environment, M. Mohan Kumar, 2011/01/18
- [Qemu-devel] [V3 PATCH 5/8] virtio-9p: Create support in chroot environment, M. Mohan Kumar, 2011/01/18
- [Qemu-devel] [V3 PATCH 6/8] virtio-9p: Support for creating special files, M. Mohan Kumar, 2011/01/18
- Re: [Qemu-devel] [V3 PATCH 6/8] virtio-9p: Support for creating special files,
Blue Swirl <=
- [Qemu-devel] [V3 PATCH 8/8] virtio-9p: Chroot environment for other functions, M. Mohan Kumar, 2011/01/18
- [Qemu-devel] [V3 PATCH 7/8] virtio-9p: Move file post creation changes to none security model, M. Mohan Kumar, 2011/01/18
- Re: [Qemu-devel] [V3 PATCH 7/8] virtio-9p: Move file post creation changes to none security model, Venkateswararao Jujjuri (JV), 2011/01/20
- Re: [Qemu-devel] [V3 PATCH 7/8] virtio-9p: Move file post creation changes to none security model, Stefan Hajnoczi, 2011/01/20
- Re: [Qemu-devel] [V3 PATCH 7/8] virtio-9p: Move file post creation changes to none security model, Venkateswararao Jujjuri (JV), 2011/01/21