From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <5941E8BF.2070304@huawei.com> Date: Thu, 15 Jun 2017 09:54:07 +0800 From: zhong jiang MIME-Version: 1.0 To: Jeff Layton CC: , , , , , Subject: Re: [PATCH] fs/fcntl: return -ESRCH in f_setown when pid/pgid can't be found References: <20170614145255.7767-1-jlayton@redhat.com> In-Reply-To: <20170614145255.7767-1-jlayton@redhat.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: yes, look good to me. but I found the another issue. if the pass argument is -1. by the spec describe, type should be assigned to PIDTYPE_MAX, Do you think that it deserve another patch ? Thanks zhongjiang On 2017/6/14 22:52, Jeff Layton wrote: > The current implementation of F_SETOWN doesn't properly vet the argument > passed in. It never returns an error. If the argument doesn't specify a > valid pid/pgid, then we just end up cleaning out the file->f_owner > structure. > > What we really want is to only clean that out only in the case where > userland passed in an argument of 0. For anything else, we want to > return ESRCH if it doesn't refer to a valid pid. > > The relevant POSIX spec page is here: > > http://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html > > Cc: Jiri Slaby > Cc: zhong jiang > Signed-off-by: Jeff Layton > --- > fs/fcntl.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) > > diff --git a/fs/fcntl.c b/fs/fcntl.c > index 693322e28751..afed3b364979 100644 > --- a/fs/fcntl.c > +++ b/fs/fcntl.c > @@ -112,8 +112,9 @@ EXPORT_SYMBOL(__f_setown); > int f_setown(struct file *filp, unsigned long arg, int force) > { > enum pid_type type; > - struct pid *pid; > - int who = arg; > + struct pid *pid = NULL; > + int who = arg, ret = 0; > + > type = PIDTYPE_PID; > if (who < 0) { > /* avoid overflow below */ > @@ -123,12 +124,19 @@ int f_setown(struct file *filp, unsigned long arg, int force) > type = PIDTYPE_PGID; > who = -who; > } > + > rcu_read_lock(); > - pid = find_vpid(who); > - __f_setown(filp, pid, type, force); > + if (who) { > + pid = find_vpid(who); > + if (!pid) > + ret = -ESRCH; > + } > + > + if (!ret) > + __f_setown(filp, pid, type, force); > rcu_read_unlock(); > > - return 0; > + return ret; > } > EXPORT_SYMBOL(f_setown); >