Messages in this thread | | | From | (Eric W. Biederman) | Date | Tue, 05 Jun 2012 09:14:58 -0700 | Subject | Re: [PATCH] fcntl: Add F_GETOWNER_UIDS option v3 |
| |
Cyrill Gorcunov <gorcunov@openvz.org> writes:
> When we restore file descriptors we would like > them to look exactly as they were at dumping time. > > With help of fcntl it's almost possible, the missing > snippet is file owners UIDs. > > To be able to read their values the F_GETOWNER_UIDS > is introduced. > > This option is valid iif CONFIG_CHECKPOINT_RESTORE > is turned on, otherwise returning -EINVAL.
You want to use from_kuid_munged instead of from_kuid as you are going directly to userspace, and to userspace for an unmapped uid we want to say 65534 aka nobody instead of -1.
> v3: > - rebased on Eric's kuids
To be clear this is based on my patchset that has been merged into v3.5-rc1.
Eric
> Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> > CC: "Eric W. Biederman" <ebiederm@xmission.com> > CC: Andrew Morton <akpm@linux-foundation.org> > CC: "Serge E. Hallyn" <serge@hallyn.com> > CC: Oleg Nesterov <oleg@redhat.com> > CC: Pavel Emelyanov <xemul@parallels.com> > --- > fs/fcntl.c | 29 +++++++++++++++++++++++++++++ > include/asm-generic/fcntl.h | 4 ++++ > security/selinux/hooks.c | 1 + > 3 files changed, 34 insertions(+) > > Index: linux-2.6.git/fs/fcntl.c > =================================================================== > --- linux-2.6.git.orig/fs/fcntl.c > +++ linux-2.6.git/fs/fcntl.c > @@ -20,6 +20,7 @@ > #include <linux/signal.h> > #include <linux/rcupdate.h> > #include <linux/pid_namespace.h> > +#include <linux/user_namespace.h> > > #include <asm/poll.h> > #include <asm/siginfo.h> > @@ -340,6 +341,31 @@ static int f_getown_ex(struct file *filp > return ret; > } > > +#ifdef CONFIG_CHECKPOINT_RESTORE > +static int f_getowner_uids(struct file *filp, unsigned long arg) > +{ > + struct user_namespace *user_ns = current_user_ns(); > + uid_t * __user dst = (void * __user)arg; > + uid_t src[2]; > + int err; > + > + read_lock(&filp->f_owner.lock); > + src[0] = from_kuid(user_ns, filp->f_owner.uid); > + src[1] = from_kuid(user_ns, filp->f_owner.euid); > + read_unlock(&filp->f_owner.lock); > + > + err = put_user(src[0], &dst[0]); > + err |= put_user(src[1], &dst[1]); > + > + return err; > +} > +#else > +static int f_getowner_uids(struct file *filp, unsigned long arg) > +{ > + return -EINVAL; > +} > +#endif > + > static long do_fcntl(int fd, unsigned int cmd, unsigned long arg, > struct file *filp) > { > @@ -396,6 +422,9 @@ static long do_fcntl(int fd, unsigned in > case F_SETOWN_EX: > err = f_setown_ex(filp, arg); > break; > + case F_GETOWNER_UIDS: > + err = f_getowner_uids(filp, arg); > + break; > case F_GETSIG: > err = filp->f_owner.signum; > break; > Index: linux-2.6.git/include/asm-generic/fcntl.h > =================================================================== > --- linux-2.6.git.orig/include/asm-generic/fcntl.h > +++ linux-2.6.git/include/asm-generic/fcntl.h > @@ -120,6 +120,10 @@ > #define F_GETOWN_EX 16 > #endif > > +#ifndef F_GETOWNER_UIDS > +#define F_GETOWNER_UIDS 17 > +#endif > + > #define F_OWNER_TID 0 > #define F_OWNER_PID 1 > #define F_OWNER_PGRP 2 > Index: linux-2.6.git/security/selinux/hooks.c > =================================================================== > --- linux-2.6.git.orig/security/selinux/hooks.c > +++ linux-2.6.git/security/selinux/hooks.c > @@ -3181,6 +3181,7 @@ static int selinux_file_fcntl(struct fil > case F_GETFL: > case F_GETOWN: > case F_GETSIG: > + case F_GETOWNER_UIDS: > /* Just check FD__USE permission */ > err = file_has_perm(cred, file, 0); > break;
| |