浏览代码

xfs: Fix open flag handling in open_by_handle code

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>
Dave Chinner 13 年之前
父节点
当前提交
1a1d772433
共有 1 个文件被更改,包括 5 次插入9 次删除
  1. 5 9
      fs/xfs/xfs_ioctl.c

+ 5 - 9
fs/xfs/xfs_ioctl.c

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