From: Gabriel de Perthuis <g2p.code@gmail.com>
To: Jeff Dike <jdike@addtoit.com>,
Richard Weinberger <richard@nod.at>,
user-mode-linux-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org
Cc: Gabriel de Perthuis <g2p.code@gmail.com>
Subject: [PATCH] um: Accept /dev/fd/* uml block devices
Date: Sat, 27 Jul 2013 17:23:27 +0200 [thread overview]
Message-ID: <1374938607-25747-1-git-send-email-g2p.code@gmail.com> (raw)
Useful for
* limiting privileges
* opening block devices O_EXCL
Use dup to work around the fact /proc/self/fd
can't be opened after dropping privileges.
This proc behaviour doesn't match TLPI and might be a bug.
Qemu has a slightly more complex fdset approach
that provides fds with different access permissions.
Signed-off-by: Gabriel de Perthuis <g2p.code@gmail.com>
---
arch/um/os-Linux/file.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c
index c17bd6f..cee65ba 100644
--- a/arch/um/os-Linux/file.c
+++ b/arch/um/os-Linux/file.c
@@ -169,11 +169,11 @@ int os_file_mode(const char *file, struct openflags *mode_out)
return err;
}
int os_open_file(const char *file, struct openflags flags, int mode)
{
- int fd, err, f = 0;
+ int fd, fd0, err, f = 0;
if (flags.r && flags.w)
f = O_RDWR;
else if (flags.r)
f = O_RDONLY;
@@ -190,11 +190,15 @@ int os_open_file(const char *file, struct openflags flags, int mode)
if (flags.e)
f |= O_EXCL;
if (flags.a)
f |= O_APPEND;
- fd = open64(file, f, mode);
+ if (!strncmp(file, "/dev/fd/", 8)
+ && sscanf(file, "/dev/fd/%d", &fd0) == 1)
+ fd = dup(fd0);
+ else
+ fd = open64(file, f, mode);
if (fd < 0)
return -errno;
if (flags.cl && fcntl(fd, F_SETFD, 1)) {
err = -errno;
@@ -280,11 +284,11 @@ int os_file_size(const char *file, unsigned long long *size_out)
if (S_ISBLK(buf.ust_mode)) {
int fd;
long blocks;
- fd = open(file, O_RDONLY, 0);
+ fd = os_open_file(file, of_read(OPENFLAGS()), 0);
if (fd < 0) {
err = -errno;
printk(UM_KERN_ERR "Couldn't open \"%s\", "
"errno = %d\n", file, errno);
return err;
--
1.8.3.3.758.g90e98ff
next reply other threads:[~2013-07-27 15:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-27 15:23 Gabriel de Perthuis [this message]
2013-07-28 8:12 ` [PATCH] um: Accept /dev/fd/* uml block devices Richard Weinberger
2013-07-28 10:25 ` Gabriel de Perthuis
2013-07-28 10:25 ` Gabriel de Perthuis
2013-07-31 23:08 ` Gabriel de Perthuis
2013-07-31 23:08 ` Gabriel de Perthuis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1374938607-25747-1-git-send-email-g2p.code@gmail.com \
--to=g2p.code@gmail.com \
--cc=jdike@addtoit.com \
--cc=linux-kernel@vger.kernel.org \
--cc=richard@nod.at \
--cc=user-mode-linux-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.