From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752383Ab2C1IQr (ORCPT ); Wed, 28 Mar 2012 04:16:47 -0400 Received: from mail-bk0-f46.google.com ([209.85.214.46]:44192 "EHLO mail-bk0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751257Ab2C1IQo (ORCPT ); Wed, 28 Mar 2012 04:16:44 -0400 Date: Wed, 28 Mar 2012 12:16:39 +0400 From: Cyrill Gorcunov To: "Eric W. Biederman" Cc: "Serge E. Hallyn" , Oleg Nesterov , LKML , Andrew Morton , Pavel Emelyanov , "Serge E. Hallyn" Subject: Re: [rfc] fcntl: Add F_GETOWNER_UIDS option Message-ID: <20120328081639.GB2286@moon> References: <20120326183330.GM19395@moon> <20120327152534.GA18478@redhat.com> <20120327165853.GH11875@moon> <20120327222923.GA31692@mail.hallyn.com> <20120327223420.GB9669@moon> <20120327224640.GA5328@mail.hallyn.com> <20120328064838.GA2286@moon> <20120328075549.GA2204@moon> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120328075549.GA2204@moon> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Something like below i think (yet untested). Cyrill --- From: Cyrill Gorcunov Subject: fcntl: Add F_GETOWNER_UIDS option v2 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. Also the call must be done from initial user-namespace for a while. This limitation migh be relaxed after, once proper [e]uids mapping between namespaces and file owners will be implemented. Signed-off-by: Cyrill Gorcunov CC: "Eric W. Biederman" CC: "Serge E. Hallyn" CC: Oleg Nesterov CC: Andrew Morton CC: Pavel Emelyanov --- fs/fcntl.c | 32 ++++++++++++++++++++++++++++++++ include/asm-generic/fcntl.h | 4 ++++ security/selinux/hooks.c | 1 + 3 files changed, 37 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 #include #include +#include #include #include @@ -340,6 +341,34 @@ 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; + + if (user_ns != &init_user_ns) + return -EINVAL; + + read_lock(&filp->f_owner.lock); + src[0] = filp->f_owner.uid; + src[1] = 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 +425,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 @@ -3138,6 +3138,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;