From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Layton Subject: Re: [PATCH v23 02/22] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Date: Tue, 05 Jul 2016 07:02:52 -0400 Message-ID: <1467716572.3800.2.camel@redhat.com> References: <1467294433-3222-1-git-send-email-agruenba@redhat.com> <1467294433-3222-3-git-send-email-agruenba@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: Christoph Hellwig , Theodore Ts'o , Andreas Dilger , "J. Bruce Fields" , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, xfs-VZNHf3L845pBDgjK7y7TUQ@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-cifs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Andreas Gruenbacher , Alexander Viro Return-path: In-Reply-To: <1467294433-3222-3-git-send-email-agruenba-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Sender: linux-api-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-cifs.vger.kernel.org On Thu, 2016-06-30 at 15:46 +0200, Andreas Gruenbacher wrote: > Richacls distinguish between creating non-directories and directories= =2E To > support that, add an isdir parameter to may_create(). When checking > inode_permission() for create permission, pass in an additional > MAY_CREATE_FILE or MAY_CREATE_DIR mask flag. >=20 > Add may_replace() to allow checking for delete and create access when > replacing an existing file in vfs_rename(). >=20 > Signed-off-by: Andreas Gruenbacher > Reviewed-by: J. Bruce Fields > Reviewed-by: Andreas Dilger > Reviewed-by: Steve French > --- > =C2=A0fs/namei.c=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= | 49 +++++++++++++++++++++++++++++++++---------------- > =C2=A0include/linux/fs.h |=C2=A0=C2=A02 ++ > =C2=A02 files changed, 35 insertions(+), 16 deletions(-) >=20 > diff --git a/fs/namei.c b/fs/namei.c > index 7cc5487..dc91858 100644 > --- a/fs/namei.c > +++ b/fs/namei.c > @@ -454,7 +454,9 @@ static int sb_permission(struct super_block *sb, = struct inode *inode, int mask) > =C2=A0 * this, letting us set arbitrary permissions for filesystem ac= cess without > =C2=A0 * changing the "normal" UIDs which are used for other things. > =C2=A0 * > - * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask= =2E > + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FI= LE, or > + * MAY_CREATE_DIR are set.=C2=A0=C2=A0That way, file systems that do= n't support these > + * permissions will check for MAY_WRITE instead. > =C2=A0 */ > =C2=A0int inode_permission(struct inode *inode, int mask) > =C2=A0{ > @@ -2763,7 +2765,8 @@ EXPORT_SYMBOL(__check_sticky); > =C2=A0 * 10. We don't allow removal of NFS sillyrenamed files; it's h= andled by > =C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0nfs_async_unlink(). > =C2=A0 */ > -static int may_delete(struct inode *dir, struct dentry *victim, bool= isdir) > +static int may_delete_or_replace(struct inode *dir, struct dentry *v= ictim, > + =C2=A0bool isdir, int mask) > =C2=A0{ > =C2=A0 struct inode *inode =3D d_backing_inode(victim); > =C2=A0 int error; > @@ -2775,7 +2778,7 @@ static int may_delete(struct inode *dir, struct= dentry *victim, bool isdir) > =C2=A0 BUG_ON(victim->d_parent->d_inode !=3D dir); > =C2=A0 audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); > =C2=A0 > - error =3D inode_permission(dir, MAY_WRITE | MAY_EXEC); > + error =3D inode_permission(dir, mask); > =C2=A0 if (error) > =C2=A0 return error; > =C2=A0 if (IS_APPEND(dir)) > @@ -2798,6 +2801,18 @@ static int may_delete(struct inode *dir, struc= t dentry *victim, bool isdir) > =C2=A0 return 0; > =C2=A0} > =C2=A0 > +static int may_delete(struct inode *dir, struct dentry *victim, bool= isdir) > +{ > + return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EX= EC); > +} > + > +static int may_replace(struct inode *dir, struct dentry *victim, boo= l isdir) > +{ > + int mask =3D isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; > + > + return may_delete_or_replace(dir, victim, isdir, mask | MAY_WRITE |= MAY_EXEC); > +} > + > =C2=A0/* Check whether we can create an object with dentry child in d= irectory > =C2=A0 *=C2=A0=C2=A0dir. > =C2=A0 *=C2=A0=C2=A01. We can't do it if child already exists (open h= as special treatment for > @@ -2806,14 +2821,16 @@ static int may_delete(struct inode *dir, stru= ct dentry *victim, bool isdir) > =C2=A0 *=C2=A0=C2=A03. We should have write and exec permissions on d= ir > =C2=A0 *=C2=A0=C2=A04. We can't do it if dir is immutable (done in pe= rmission()) > =C2=A0 */ > -static inline int may_create(struct inode *dir, struct dentry *child= ) > +static inline int may_create(struct inode *dir, struct dentry *child= , bool isdir) > =C2=A0{ > + int mask =3D isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; > + > =C2=A0 audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); > =C2=A0 if (child->d_inode) > =C2=A0 return -EEXIST; > =C2=A0 if (IS_DEADDIR(dir)) > =C2=A0 return -ENOENT; > - return inode_permission(dir, MAY_WRITE | MAY_EXEC); > + return inode_permission(dir, MAY_WRITE | MAY_EXEC | mask); > =C2=A0} > =C2=A0 > =C2=A0/* > @@ -2863,7 +2880,7 @@ EXPORT_SYMBOL(unlock_rename); > =C2=A0int vfs_create(struct inode *dir, struct dentry *dentry, umode_= t mode, > =C2=A0 bool want_excl) > =C2=A0{ > - int error =3D may_create(dir, dentry); > + int error =3D may_create(dir, dentry, false); > =C2=A0 if (error) > =C2=A0 return error; > =C2=A0 > @@ -3650,7 +3667,7 @@ EXPORT_SYMBOL(user_path_create); > =C2=A0 > =C2=A0int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t= mode, dev_t dev) > =C2=A0{ > - int error =3D may_create(dir, dentry); > + int error =3D may_create(dir, dentry, false); > =C2=A0 > =C2=A0 if (error) > =C2=A0 return error; > @@ -3744,7 +3761,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, fil= ename, umode_t, mode, unsigned, d > =C2=A0 > =C2=A0int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t= mode) > =C2=A0{ > - int error =3D may_create(dir, dentry); > + int error =3D may_create(dir, dentry, true); > =C2=A0 unsigned max_links =3D dir->i_sb->s_max_links; > =C2=A0 > =C2=A0 if (error) > @@ -3800,7 +3817,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pat= hname, umode_t, mode) > =C2=A0 > =C2=A0int vfs_rmdir(struct inode *dir, struct dentry *dentry) > =C2=A0{ > - int error =3D may_delete(dir, dentry, 1); > + int error =3D may_delete(dir, dentry, true); > =C2=A0 > =C2=A0 if (error) > =C2=A0 return error; > @@ -3922,7 +3939,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pat= hname) > =C2=A0int vfs_unlink(struct inode *dir, struct dentry *dentry, struct= inode **delegated_inode) > =C2=A0{ > =C2=A0 struct inode *target =3D dentry->d_inode; > - int error =3D may_delete(dir, dentry, 0); > + int error =3D may_delete(dir, dentry, false); > =C2=A0 > =C2=A0 if (error) > =C2=A0 return error; > @@ -4056,7 +4073,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pa= thname) > =C2=A0 > =C2=A0int vfs_symlink(struct inode *dir, struct dentry *dentry, const= char *oldname) > =C2=A0{ > - int error =3D may_create(dir, dentry); > + int error =3D may_create(dir, dentry, false); > =C2=A0 > =C2=A0 if (error) > =C2=A0 return error; > @@ -4139,7 +4156,7 @@ int vfs_link(struct dentry *old_dentry, struct = inode *dir, struct dentry *new_de > =C2=A0 if (!inode) > =C2=A0 return -ENOENT; > =C2=A0 > - error =3D may_create(dir, new_dentry); > + error =3D may_create(dir, new_dentry, false); > =C2=A0 if (error) > =C2=A0 return error; > =C2=A0 > @@ -4336,14 +4353,14 @@ int vfs_rename(struct inode *old_dir, struct = dentry *old_dentry, > =C2=A0 return error; > =C2=A0 > =C2=A0 if (!target) { > - error =3D may_create(new_dir, new_dentry); > + error =3D may_create(new_dir, new_dentry, is_dir); > =C2=A0 } else { > =C2=A0 new_is_dir =3D d_is_dir(new_dentry); > =C2=A0 > =C2=A0 if (!(flags & RENAME_EXCHANGE)) > - error =3D may_delete(new_dir, new_dentry, is_dir); > + error =3D may_replace(new_dir, new_dentry, is_dir); > =C2=A0 else > - error =3D may_delete(new_dir, new_dentry, new_is_dir); > + error =3D may_replace(new_dir, new_dentry, new_is_dir); > =C2=A0 } > =C2=A0 if (error) > =C2=A0 return error; > @@ -4606,7 +4623,7 @@ SYSCALL_DEFINE2(rename, const char __user *, ol= dname, const char __user *, newna > =C2=A0 > =C2=A0int vfs_whiteout(struct inode *dir, struct dentry *dentry) > =C2=A0{ > - int error =3D may_create(dir, dentry); > + int error =3D may_create(dir, dentry, false); > =C2=A0 if (error) > =C2=A0 return error; > =C2=A0 > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 4ad130c..dd614ad 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -84,6 +84,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff= _t offset, > =C2=A0#define MAY_CHDIR 0x00000040 > =C2=A0/* called from RCU mode, don't block */ > =C2=A0#define MAY_NOT_BLOCK 0x00000080 > +#define MAY_CREATE_FILE 0x00000100 > +#define MAY_CREATE_DIR 0x00000200 > =C2=A0 > =C2=A0/* > =C2=A0 * flags in file.f_mode.=C2=A0=C2=A0Note that FMODE_READ and FM= ODE_WRITE must correspond Reviewed-by: Jeff Layton From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754855AbcGELKr (ORCPT ); Tue, 5 Jul 2016 07:10:47 -0400 Received: from mail-qt0-f177.google.com ([209.85.216.177]:36690 "EHLO mail-qt0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754505AbcGELKp (ORCPT ); Tue, 5 Jul 2016 07:10:45 -0400 Message-ID: <1467716572.3800.2.camel@redhat.com> Subject: Re: [PATCH v23 02/22] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags From: Jeff Layton To: Andreas Gruenbacher , Alexander Viro Cc: Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Date: Tue, 05 Jul 2016 07:02:52 -0400 In-Reply-To: <1467294433-3222-3-git-send-email-agruenba@redhat.com> References: <1467294433-3222-1-git-send-email-agruenba@redhat.com> <1467294433-3222-3-git-send-email-agruenba@redhat.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 2016-06-30 at 15:46 +0200, Andreas Gruenbacher wrote: > Richacls distinguish between creating non-directories and directories. To > support that, add an isdir parameter to may_create(). When checking > inode_permission() for create permission, pass in an additional > MAY_CREATE_FILE or MAY_CREATE_DIR mask flag. > > Add may_replace() to allow checking for delete and create access when > replacing an existing file in vfs_rename(). > > Signed-off-by: Andreas Gruenbacher > Reviewed-by: J. Bruce Fields > Reviewed-by: Andreas Dilger > Reviewed-by: Steve French > --- >  fs/namei.c         | 49 +++++++++++++++++++++++++++++++++---------------- >  include/linux/fs.h |  2 ++ >  2 files changed, 35 insertions(+), 16 deletions(-) > > diff --git a/fs/namei.c b/fs/namei.c > index 7cc5487..dc91858 100644 > --- a/fs/namei.c > +++ b/fs/namei.c > @@ -454,7 +454,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) >   * this, letting us set arbitrary permissions for filesystem access without >   * changing the "normal" UIDs which are used for other things. >   * > - * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask. > + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or > + * MAY_CREATE_DIR are set.  That way, file systems that don't support these > + * permissions will check for MAY_WRITE instead. >   */ >  int inode_permission(struct inode *inode, int mask) >  { > @@ -2763,7 +2765,8 @@ EXPORT_SYMBOL(__check_sticky); >   * 10. We don't allow removal of NFS sillyrenamed files; it's handled by >   *     nfs_async_unlink(). >   */ > -static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) > +static int may_delete_or_replace(struct inode *dir, struct dentry *victim, > +  bool isdir, int mask) >  { >   struct inode *inode = d_backing_inode(victim); >   int error; > @@ -2775,7 +2778,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) >   BUG_ON(victim->d_parent->d_inode != dir); >   audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); >   > - error = inode_permission(dir, MAY_WRITE | MAY_EXEC); > + error = inode_permission(dir, mask); >   if (error) >   return error; >   if (IS_APPEND(dir)) > @@ -2798,6 +2801,18 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) >   return 0; >  } >   > +static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) > +{ > + return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); > +} > + > +static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) > +{ > + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; > + > + return may_delete_or_replace(dir, victim, isdir, mask | MAY_WRITE | MAY_EXEC); > +} > + >  /* Check whether we can create an object with dentry child in directory >   *  dir. >   *  1. We can't do it if child already exists (open has special treatment for > @@ -2806,14 +2821,16 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) >   *  3. We should have write and exec permissions on dir >   *  4. We can't do it if dir is immutable (done in permission()) >   */ > -static inline int may_create(struct inode *dir, struct dentry *child) > +static inline int may_create(struct inode *dir, struct dentry *child, bool isdir) >  { > + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; > + >   audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); >   if (child->d_inode) >   return -EEXIST; >   if (IS_DEADDIR(dir)) >   return -ENOENT; > - return inode_permission(dir, MAY_WRITE | MAY_EXEC); > + return inode_permission(dir, MAY_WRITE | MAY_EXEC | mask); >  } >   >  /* > @@ -2863,7 +2880,7 @@ EXPORT_SYMBOL(unlock_rename); >  int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, >   bool want_excl) >  { > - int error = may_create(dir, dentry); > + int error = may_create(dir, dentry, false); >   if (error) >   return error; >   > @@ -3650,7 +3667,7 @@ EXPORT_SYMBOL(user_path_create); >   >  int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) >  { > - int error = may_create(dir, dentry); > + int error = may_create(dir, dentry, false); >   >   if (error) >   return error; > @@ -3744,7 +3761,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, d >   >  int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) >  { > - int error = may_create(dir, dentry); > + int error = may_create(dir, dentry, true); >   unsigned max_links = dir->i_sb->s_max_links; >   >   if (error) > @@ -3800,7 +3817,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode) >   >  int vfs_rmdir(struct inode *dir, struct dentry *dentry) >  { > - int error = may_delete(dir, dentry, 1); > + int error = may_delete(dir, dentry, true); >   >   if (error) >   return error; > @@ -3922,7 +3939,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) >  int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) >  { >   struct inode *target = dentry->d_inode; > - int error = may_delete(dir, dentry, 0); > + int error = may_delete(dir, dentry, false); >   >   if (error) >   return error; > @@ -4056,7 +4073,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) >   >  int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) >  { > - int error = may_create(dir, dentry); > + int error = may_create(dir, dentry, false); >   >   if (error) >   return error; > @@ -4139,7 +4156,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de >   if (!inode) >   return -ENOENT; >   > - error = may_create(dir, new_dentry); > + error = may_create(dir, new_dentry, false); >   if (error) >   return error; >   > @@ -4336,14 +4353,14 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, >   return error; >   >   if (!target) { > - error = may_create(new_dir, new_dentry); > + error = may_create(new_dir, new_dentry, is_dir); >   } else { >   new_is_dir = d_is_dir(new_dentry); >   >   if (!(flags & RENAME_EXCHANGE)) > - error = may_delete(new_dir, new_dentry, is_dir); > + error = may_replace(new_dir, new_dentry, is_dir); >   else > - error = may_delete(new_dir, new_dentry, new_is_dir); > + error = may_replace(new_dir, new_dentry, new_is_dir); >   } >   if (error) >   return error; > @@ -4606,7 +4623,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna >   >  int vfs_whiteout(struct inode *dir, struct dentry *dentry) >  { > - int error = may_create(dir, dentry); > + int error = may_create(dir, dentry, false); >   if (error) >   return error; >   > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 4ad130c..dd614ad 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -84,6 +84,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, >  #define MAY_CHDIR 0x00000040 >  /* called from RCU mode, don't block */ >  #define MAY_NOT_BLOCK 0x00000080 > +#define MAY_CREATE_FILE 0x00000100 > +#define MAY_CREATE_DIR 0x00000200 >   >  /* >   * flags in file.f_mode.  Note that FMODE_READ and FMODE_WRITE must correspond Reviewed-by: Jeff Layton From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6ACDE7CBE for ; Tue, 5 Jul 2016 06:03:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B164230404E for ; Tue, 5 Jul 2016 04:02:59 -0700 (PDT) Received: from mail-qt0-f179.google.com (mail-qt0-f179.google.com [209.85.216.179]) by cuda.sgi.com with ESMTP id PBeObZcjPOkcEwpP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 05 Jul 2016 04:02:55 -0700 (PDT) Received: by mail-qt0-f179.google.com with SMTP id w59so98834410qtd.3 for ; Tue, 05 Jul 2016 04:02:55 -0700 (PDT) Message-ID: <1467716572.3800.2.camel@redhat.com> Subject: Re: [PATCH v23 02/22] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags From: Jeff Layton Date: Tue, 05 Jul 2016 07:02:52 -0400 In-Reply-To: <1467294433-3222-3-git-send-email-agruenba@redhat.com> References: <1467294433-3222-1-git-send-email-agruenba@redhat.com> <1467294433-3222-3-git-send-email-agruenba@redhat.com> Mime-Version: 1.0 List-Id: XFS Filesystem from SGI List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xfs-bounces@oss.sgi.com Sender: xfs-bounces@oss.sgi.com To: Andreas Gruenbacher , Alexander Viro Cc: "J. Bruce Fields" , linux-nfs@vger.kernel.org, Theodore Ts'o , linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Trond Myklebust , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , Andreas Dilger , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Anna Schumaker T24gVGh1LCAyMDE2LTA2LTMwIGF0IDE1OjQ2ICswMjAwLCBBbmRyZWFzIEdydWVuYmFjaGVyIHdy b3RlOgo+IFJpY2hhY2xzIGRpc3Rpbmd1aXNoIGJldHdlZW4gY3JlYXRpbmcgbm9uLWRpcmVjdG9y aWVzIGFuZCBkaXJlY3Rvcmllcy4gVG8KPiBzdXBwb3J0IHRoYXQsIGFkZCBhbiBpc2RpciBwYXJh bWV0ZXIgdG8gbWF5X2NyZWF0ZSgpLiBXaGVuIGNoZWNraW5nCj4gaW5vZGVfcGVybWlzc2lvbigp IGZvciBjcmVhdGUgcGVybWlzc2lvbiwgcGFzcyBpbiBhbiBhZGRpdGlvbmFsCj4gTUFZX0NSRUFU RV9GSUxFIG9yIE1BWV9DUkVBVEVfRElSIG1hc2sgZmxhZy4KPiAKPiBBZGQgbWF5X3JlcGxhY2Uo KSB0byBhbGxvdyBjaGVja2luZyBmb3IgZGVsZXRlIGFuZCBjcmVhdGUgYWNjZXNzIHdoZW4KPiBy ZXBsYWNpbmcgYW4gZXhpc3RpbmcgZmlsZSBpbiB2ZnNfcmVuYW1lKCkuCj4gCj4gU2lnbmVkLW9m Zi1ieTogQW5kcmVhcyBHcnVlbmJhY2hlciA8YWdydWVuYmFAcmVkaGF0LmNvbT4KPiBSZXZpZXdl ZC1ieTogSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHJlZGhhdC5jb20+Cj4gUmV2aWV3ZWQtYnk6 IEFuZHJlYXMgRGlsZ2VyIDxhZGlsZ2VyQGRpbGdlci5jYT4KPiBSZXZpZXdlZC1ieTogU3RldmUg RnJlbmNoIDxzdGV2ZS5mcmVuY2hAcHJpbWFyeWRhdGEuY29tPgo+IC0tLQo+IMKgZnMvbmFtZWku Y8KgwqDCoMKgwqDCoMKgwqDCoHwgNDkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr LS0tLS0tLS0tLS0tLS0tLQo+IMKgaW5jbHVkZS9saW51eC9mcy5oIHzCoMKgMiArKwo+IMKgMiBm aWxlcyBjaGFuZ2VkLCAzNSBpbnNlcnRpb25zKCspLCAxNiBkZWxldGlvbnMoLSkKPiAKPiBkaWZm IC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKPiBpbmRleCA3Y2M1NDg3Li5kYzkxODU4 IDEwMDY0NAo+IC0tLSBhL2ZzL25hbWVpLmMKPiArKysgYi9mcy9uYW1laS5jCj4gQEAgLTQ1NCw3 ICs0NTQsOSBAQCBzdGF0aWMgaW50IHNiX3Blcm1pc3Npb24oc3RydWN0IHN1cGVyX2Jsb2NrICpz Yiwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCj4gwqAgKiB0aGlzLCBsZXR0aW5nIHVz IHNldCBhcmJpdHJhcnkgcGVybWlzc2lvbnMgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzIHdpdGhvdXQK PiDCoCAqIGNoYW5naW5nIHRoZSAibm9ybWFsIiBVSURzIHdoaWNoIGFyZSB1c2VkIGZvciBvdGhl ciB0aGluZ3MuCj4gwqAgKgo+IC0gKiBXaGVuIGNoZWNraW5nIGZvciBNQVlfQVBQRU5ELCBNQVlf V1JJVEUgbXVzdCBhbHNvIGJlIHNldCBpbiBAbWFzay4KPiArICogTUFZX1dSSVRFIG11c3QgYmUg c2V0IGluIEBtYXNrIHdoZW5ldmVyIE1BWV9BUFBFTkQsIE1BWV9DUkVBVEVfRklMRSwgb3IKPiAr ICogTUFZX0NSRUFURV9ESVIgYXJlIHNldC7CoMKgVGhhdCB3YXksIGZpbGUgc3lzdGVtcyB0aGF0 IGRvbid0IHN1cHBvcnQgdGhlc2UKPiArICogcGVybWlzc2lvbnMgd2lsbCBjaGVjayBmb3IgTUFZ X1dSSVRFIGluc3RlYWQuCj4gwqAgKi8KPiDCoGludCBpbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBp bm9kZSAqaW5vZGUsIGludCBtYXNrKQo+IMKgewo+IEBAIC0yNzYzLDcgKzI3NjUsOCBAQCBFWFBP UlRfU1lNQk9MKF9fY2hlY2tfc3RpY2t5KTsKPiDCoCAqIDEwLiBXZSBkb24ndCBhbGxvdyByZW1v dmFsIG9mIE5GUyBzaWxseXJlbmFtZWQgZmlsZXM7IGl0J3MgaGFuZGxlZCBieQo+IMKgICrCoMKg wqDCoMKgbmZzX2FzeW5jX3VubGluaygpLgo+IMKgICovCj4gLXN0YXRpYyBpbnQgbWF5X2RlbGV0 ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqdmljdGltLCBib29sIGlzZGlyKQo+ ICtzdGF0aWMgaW50IG1heV9kZWxldGVfb3JfcmVwbGFjZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3Ry dWN0IGRlbnRyeSAqdmljdGltLAo+ICsJCQkJwqBib29sIGlzZGlyLCBpbnQgbWFzaykKPiDCoHsK PiDCoAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZF9iYWNraW5nX2lub2RlKHZpY3RpbSk7Cj4gwqAJ aW50IGVycm9yOwo+IEBAIC0yNzc1LDcgKzI3NzgsNyBAQCBzdGF0aWMgaW50IG1heV9kZWxldGUo c3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKnZpY3RpbSwgYm9vbCBpc2RpcikKPiDC oAlCVUdfT04odmljdGltLT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBkaXIpOwo+IMKgCWF1ZGl0X2lu b2RlX2NoaWxkKGRpciwgdmljdGltLCBBVURJVF9UWVBFX0NISUxEX0RFTEVURSk7Cj4gwqAKPiAt CWVycm9yID0gaW5vZGVfcGVybWlzc2lvbihkaXIsIE1BWV9XUklURSB8IE1BWV9FWEVDKTsKPiAr CWVycm9yID0gaW5vZGVfcGVybWlzc2lvbihkaXIsIG1hc2spOwo+IMKgCWlmIChlcnJvcikKPiDC oAkJcmV0dXJuIGVycm9yOwo+IMKgCWlmIChJU19BUFBFTkQoZGlyKSkKPiBAQCAtMjc5OCw2ICsy ODAxLDE4IEBAIHN0YXRpYyBpbnQgbWF5X2RlbGV0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0 IGRlbnRyeSAqdmljdGltLCBib29sIGlzZGlyKQo+IMKgCXJldHVybiAwOwo+IMKgfQo+IMKgCj4g K3N0YXRpYyBpbnQgbWF5X2RlbGV0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAq dmljdGltLCBib29sIGlzZGlyKQo+ICt7Cj4gKwlyZXR1cm4gbWF5X2RlbGV0ZV9vcl9yZXBsYWNl KGRpciwgdmljdGltLCBpc2RpciwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IG1heV9yZXBsYWNlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICp2 aWN0aW0sIGJvb2wgaXNkaXIpCj4gK3sKPiArCWludCBtYXNrID0gaXNkaXIgPyBNQVlfQ1JFQVRF X0RJUiA6IE1BWV9DUkVBVEVfRklMRTsKPiArCj4gKwlyZXR1cm4gbWF5X2RlbGV0ZV9vcl9yZXBs YWNlKGRpciwgdmljdGltLCBpc2RpciwgbWFzayB8IE1BWV9XUklURSB8IE1BWV9FWEVDKTsKPiAr fQo+ICsKPiDCoC8qCUNoZWNrIHdoZXRoZXIgd2UgY2FuIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aCBk ZW50cnkgY2hpbGQgaW4gZGlyZWN0b3J5Cj4gwqAgKsKgwqBkaXIuCj4gwqAgKsKgwqAxLiBXZSBj YW4ndCBkbyBpdCBpZiBjaGlsZCBhbHJlYWR5IGV4aXN0cyAob3BlbiBoYXMgc3BlY2lhbCB0cmVh dG1lbnQgZm9yCj4gQEAgLTI4MDYsMTQgKzI4MjEsMTYgQEAgc3RhdGljIGludCBtYXlfZGVsZXRl KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICp2aWN0aW0sIGJvb2wgaXNkaXIpCj4g wqAgKsKgwqAzLiBXZSBzaG91bGQgaGF2ZSB3cml0ZSBhbmQgZXhlYyBwZXJtaXNzaW9ucyBvbiBk aXIKPiDCoCAqwqDCoDQuIFdlIGNhbid0IGRvIGl0IGlmIGRpciBpcyBpbW11dGFibGUgKGRvbmUg aW4gcGVybWlzc2lvbigpKQo+IMKgICovCj4gLXN0YXRpYyBpbmxpbmUgaW50IG1heV9jcmVhdGUo c3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmNoaWxkKQo+ICtzdGF0aWMgaW5saW5l IGludCBtYXlfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpjaGlsZCwg Ym9vbCBpc2RpcikKPiDCoHsKPiArCWludCBtYXNrID0gaXNkaXIgPyBNQVlfQ1JFQVRFX0RJUiA6 IE1BWV9DUkVBVEVfRklMRTsKPiArCj4gwqAJYXVkaXRfaW5vZGVfY2hpbGQoZGlyLCBjaGlsZCwg QVVESVRfVFlQRV9DSElMRF9DUkVBVEUpOwo+IMKgCWlmIChjaGlsZC0+ZF9pbm9kZSkKPiDCoAkJ cmV0dXJuIC1FRVhJU1Q7Cj4gwqAJaWYgKElTX0RFQURESVIoZGlyKSkKPiDCoAkJcmV0dXJuIC1F Tk9FTlQ7Cj4gLQlyZXR1cm4gaW5vZGVfcGVybWlzc2lvbihkaXIsIE1BWV9XUklURSB8IE1BWV9F WEVDKTsKPiArCXJldHVybiBpbm9kZV9wZXJtaXNzaW9uKGRpciwgTUFZX1dSSVRFIHwgTUFZX0VY RUMgfCBtYXNrKTsKPiDCoH0KPiDCoAo+IMKgLyoKPiBAQCAtMjg2Myw3ICsyODgwLDcgQEAgRVhQ T1JUX1NZTUJPTCh1bmxvY2tfcmVuYW1lKTsKPiDCoGludCB2ZnNfY3JlYXRlKHN0cnVjdCBpbm9k ZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVtb2RlX3QgbW9kZSwKPiDCoAkJYm9vbCB3 YW50X2V4Y2wpCj4gwqB7Cj4gLQlpbnQgZXJyb3IgPSBtYXlfY3JlYXRlKGRpciwgZGVudHJ5KTsK PiArCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnksIGZhbHNlKTsKPiDCoAlpZiAo ZXJyb3IpCj4gwqAJCXJldHVybiBlcnJvcjsKPiDCoAo+IEBAIC0zNjUwLDcgKzM2NjcsNyBAQCBF WFBPUlRfU1lNQk9MKHVzZXJfcGF0aF9jcmVhdGUpOwo+IMKgCj4gwqBpbnQgdmZzX21rbm9kKHN0 cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVtb2RlX3QgbW9kZSwgZGV2 X3QgZGV2KQo+IMKgewo+IC0JaW50IGVycm9yID0gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSk7Cj4g KwlpbnQgZXJyb3IgPSBtYXlfY3JlYXRlKGRpciwgZGVudHJ5LCBmYWxzZSk7Cj4gwqAKPiDCoAlp ZiAoZXJyb3IpCj4gwqAJCXJldHVybiBlcnJvcjsKPiBAQCAtMzc0NCw3ICszNzYxLDcgQEAgU1lT Q0FMTF9ERUZJTkUzKG1rbm9kLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdW1vZGVf dCwgbW9kZSwgdW5zaWduZWQsIGQKPiDCoAo+IMKgaW50IHZmc19ta2RpcihzdHJ1Y3QgaW5vZGUg KmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bW9kZV90IG1vZGUpCj4gwqB7Cj4gLQlpbnQg ZXJyb3IgPSBtYXlfY3JlYXRlKGRpciwgZGVudHJ5KTsKPiArCWludCBlcnJvciA9IG1heV9jcmVh dGUoZGlyLCBkZW50cnksIHRydWUpOwo+IMKgCXVuc2lnbmVkIG1heF9saW5rcyA9IGRpci0+aV9z Yi0+c19tYXhfbGlua3M7Cj4gwqAKPiDCoAlpZiAoZXJyb3IpCj4gQEAgLTM4MDAsNyArMzgxNyw3 IEBAIFNZU0NBTExfREVGSU5FMihta2RpciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUs IHVtb2RlX3QsIG1vZGUpCj4gwqAKPiDCoGludCB2ZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIs IHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKPiDCoHsKPiAtCWludCBlcnJvciA9IG1heV9kZWxldGUo ZGlyLCBkZW50cnksIDEpOwo+ICsJaW50IGVycm9yID0gbWF5X2RlbGV0ZShkaXIsIGRlbnRyeSwg dHJ1ZSk7Cj4gwqAKPiDCoAlpZiAoZXJyb3IpCj4gwqAJCXJldHVybiBlcnJvcjsKPiBAQCAtMzky Miw3ICszOTM5LDcgQEAgU1lTQ0FMTF9ERUZJTkUxKHJtZGlyLCBjb25zdCBjaGFyIF9fdXNlciAq LCBwYXRobmFtZSkKPiDCoGludCB2ZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3Qg ZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqKmRlbGVnYXRlZF9pbm9kZSkKPiDCoHsKPiDC oAlzdHJ1Y3QgaW5vZGUgKnRhcmdldCA9IGRlbnRyeS0+ZF9pbm9kZTsKPiAtCWludCBlcnJvciA9 IG1heV9kZWxldGUoZGlyLCBkZW50cnksIDApOwo+ICsJaW50IGVycm9yID0gbWF5X2RlbGV0ZShk aXIsIGRlbnRyeSwgZmFsc2UpOwo+IMKgCj4gwqAJaWYgKGVycm9yKQo+IMKgCQlyZXR1cm4gZXJy b3I7Cj4gQEAgLTQwNTYsNyArNDA3Myw3IEBAIFNZU0NBTExfREVGSU5FMSh1bmxpbmssIGNvbnN0 IGNoYXIgX191c2VyICosIHBhdGhuYW1lKQo+IMKgCj4gwqBpbnQgdmZzX3N5bWxpbmsoc3RydWN0 IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqb2xkbmFtZSkK PiDCoHsKPiAtCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnkpOwo+ICsJaW50IGVy cm9yID0gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSwgZmFsc2UpOwo+IMKgCj4gwqAJaWYgKGVycm9y KQo+IMKgCQlyZXR1cm4gZXJyb3I7Cj4gQEAgLTQxMzksNyArNDE1Niw3IEBAIGludCB2ZnNfbGlu ayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRl bnRyeSAqbmV3X2RlCj4gwqAJaWYgKCFpbm9kZSkKPiDCoAkJcmV0dXJuIC1FTk9FTlQ7Cj4gwqAK PiAtCWVycm9yID0gbWF5X2NyZWF0ZShkaXIsIG5ld19kZW50cnkpOwo+ICsJZXJyb3IgPSBtYXlf Y3JlYXRlKGRpciwgbmV3X2RlbnRyeSwgZmFsc2UpOwo+IMKgCWlmIChlcnJvcikKPiDCoAkJcmV0 dXJuIGVycm9yOwo+IMKgCj4gQEAgLTQzMzYsMTQgKzQzNTMsMTQgQEAgaW50IHZmc19yZW5hbWUo c3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAo+IMKgCQly ZXR1cm4gZXJyb3I7Cj4gwqAKPiDCoAlpZiAoIXRhcmdldCkgewo+IC0JCWVycm9yID0gbWF5X2Ny ZWF0ZShuZXdfZGlyLCBuZXdfZGVudHJ5KTsKPiArCQllcnJvciA9IG1heV9jcmVhdGUobmV3X2Rp ciwgbmV3X2RlbnRyeSwgaXNfZGlyKTsKPiDCoAl9IGVsc2Ugewo+IMKgCQluZXdfaXNfZGlyID0g ZF9pc19kaXIobmV3X2RlbnRyeSk7Cj4gwqAKPiDCoAkJaWYgKCEoZmxhZ3MgJiBSRU5BTUVfRVhD SEFOR0UpKQo+IC0JCQllcnJvciA9IG1heV9kZWxldGUobmV3X2RpciwgbmV3X2RlbnRyeSwgaXNf ZGlyKTsKPiArCQkJZXJyb3IgPSBtYXlfcmVwbGFjZShuZXdfZGlyLCBuZXdfZGVudHJ5LCBpc19k aXIpOwo+IMKgCQllbHNlCj4gLQkJCWVycm9yID0gbWF5X2RlbGV0ZShuZXdfZGlyLCBuZXdfZGVu dHJ5LCBuZXdfaXNfZGlyKTsKPiArCQkJZXJyb3IgPSBtYXlfcmVwbGFjZShuZXdfZGlyLCBuZXdf ZGVudHJ5LCBuZXdfaXNfZGlyKTsKPiDCoAl9Cj4gwqAJaWYgKGVycm9yKQo+IMKgCQlyZXR1cm4g ZXJyb3I7Cj4gQEAgLTQ2MDYsNyArNDYyMyw3IEBAIFNZU0NBTExfREVGSU5FMihyZW5hbWUsIGNv bnN0IGNoYXIgX191c2VyICosIG9sZG5hbWUsIGNvbnN0IGNoYXIgX191c2VyICosIG5ld25hCj4g wqAKPiDCoGludCB2ZnNfd2hpdGVvdXQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkg KmRlbnRyeSkKPiDCoHsKPiAtCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnkpOwo+ ICsJaW50IGVycm9yID0gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSwgZmFsc2UpOwo+IMKgCWlmIChl cnJvcikKPiDCoAkJcmV0dXJuIGVycm9yOwo+IMKgCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlu dXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAo+IGluZGV4IDRhZDEzMGMuLmRkNjE0YWQgMTAw NjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9mcy5o Cj4gQEAgLTg0LDYgKzg0LDggQEAgdHlwZWRlZiBpbnQgKGRpb19pb2RvbmVfdCkoc3RydWN0IGtp b2NiICppb2NiLCBsb2ZmX3Qgb2Zmc2V0LAo+IMKgI2RlZmluZSBNQVlfQ0hESVIJCTB4MDAwMDAw NDAKPiDCoC8qIGNhbGxlZCBmcm9tIFJDVSBtb2RlLCBkb24ndCBibG9jayAqLwo+IMKgI2RlZmlu ZSBNQVlfTk9UX0JMT0NLCQkweDAwMDAwMDgwCj4gKyNkZWZpbmUgTUFZX0NSRUFURV9GSUxFCQkw eDAwMDAwMTAwCj4gKyNkZWZpbmUgTUFZX0NSRUFURV9ESVIJCTB4MDAwMDAyMDAKPiDCoAo+IMKg LyoKPiDCoCAqIGZsYWdzIGluIGZpbGUuZl9tb2RlLsKgwqBOb3RlIHRoYXQgRk1PREVfUkVBRCBh bmQgRk1PREVfV1JJVEUgbXVzdCBjb3JyZXNwb25kCgpSZXZpZXdlZC1ieTogSmVmZiBMYXl0b24g PGpsYXl0b25AcmVkaGF0LmNvbT4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCnhmcyBtYWlsaW5nIGxpc3QKeGZzQG9zcy5zZ2kuY29tCmh0dHA6Ly9vc3Mu c2dpLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3hmcwo=