xfs: Fix open flag handling in open_by_handle code
authorDave Chinner <dchinner@redhat.com>
Thu, 22 Mar 2012 05:15:06 +0000 (05:15 +0000)
committerBen Myers <bpm@sgi.com>
Thu, 22 Mar 2012 20:56:52 +0000 (15:56 -0500)
Sparse identified some unsafe handling of open flags in the xfs open
by handle ioctl code. Update the code to use the correct access
macros to ensure that we handle the open flags correctly.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
fs/xfs/xfs_ioctl.c

index f588320dc4b9070a6d2c65244a9a7ed9ac1cc462..91f8ff547ab3771f3df70e631aaf0804256f8eba 100644 (file)
@@ -209,6 +209,7 @@ xfs_open_by_handle(
        struct file             *filp;
        struct inode            *inode;
        struct dentry           *dentry;
+       fmode_t                 fmode;
 
        if (!capable(CAP_SYS_ADMIN))
                return -XFS_ERROR(EPERM);
@@ -228,26 +229,21 @@ xfs_open_by_handle(
        hreq->oflags |= O_LARGEFILE;
 #endif
 
-       /* Put open permission in namei format. */
        permflag = hreq->oflags;
-       if ((permflag+1) & O_ACCMODE)
-               permflag++;
-       if (permflag & O_TRUNC)
-               permflag |= 2;
-
+       fmode = OPEN_FMODE(permflag);
        if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) &&
-           (permflag & FMODE_WRITE) && IS_APPEND(inode)) {
+           (fmode & FMODE_WRITE) && IS_APPEND(inode)) {
                error = -XFS_ERROR(EPERM);
                goto out_dput;
        }
 
-       if ((permflag & FMODE_WRITE) && IS_IMMUTABLE(inode)) {
+       if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) {
                error = -XFS_ERROR(EACCES);
                goto out_dput;
        }
 
        /* Can't write directories. */
-       if (S_ISDIR(inode->i_mode) && (permflag & FMODE_WRITE)) {
+       if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) {
                error = -XFS_ERROR(EISDIR);
                goto out_dput;
        }