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 <jslaby@xxxxxxx> > Cc: zhong jiang <zhongjiang@xxxxxxxxxx> > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > 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); >