Commit f1811cf6 authored by Ira Weiny's avatar Ira Weiny Committed by Greg Kroah-Hartman

staging/rdma/hfi1: Further clean up hfi1_ioctl parameter checks

Final clean up of the if/then/else clause for the parameter checks of
hfi1_ioctl
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarIra Weiny <ira.weiny@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d8e499ff
...@@ -982,24 +982,28 @@ static long hfi1_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) ...@@ -982,24 +982,28 @@ static long hfi1_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
struct hfi1_pportdata *ppd = NULL; struct hfi1_pportdata *ppd = NULL;
unsigned int index; unsigned int index;
struct hfi1_link_info link_info; struct hfi1_link_info link_info;
int read_cmd, write_cmd, read_ok, write_ok;
dd = hfi1_dd_from_sc_inode(fp->f_inode); dd = hfi1_dd_from_sc_inode(fp->f_inode);
if (!dd) if (!dd)
return -ENODEV; return -ENODEV;
mode_flag = dd->hfi1_snoop.mode_flag; mode_flag = dd->hfi1_snoop.mode_flag;
read_cmd = _IOC_DIR(cmd) & _IOC_READ;
write_cmd = _IOC_DIR(cmd) & _IOC_WRITE;
write_ok = access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
read_ok = access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
if (((_IOC_DIR(cmd) & _IOC_READ) if ((read_cmd && !write_ok) || (write_cmd && !read_ok))
&& !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)))
|| ((_IOC_DIR(cmd) & _IOC_WRITE)
&& !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)))) {
return -EFAULT; return -EFAULT;
} else if (!capable(CAP_SYS_ADMIN)) {
if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
} else if ((mode_flag & HFI1_PORT_CAPTURE_MODE) &&
(cmd != HFI1_SNOOP_IOCCLEARQUEUE) && if ((mode_flag & HFI1_PORT_CAPTURE_MODE) &&
(cmd != HFI1_SNOOP_IOCCLEARFILTER) && (cmd != HFI1_SNOOP_IOCCLEARQUEUE) &&
(cmd != HFI1_SNOOP_IOCSETFILTER)) { (cmd != HFI1_SNOOP_IOCCLEARFILTER) &&
(cmd != HFI1_SNOOP_IOCSETFILTER))
/* Capture devices are allowed only 3 operations /* Capture devices are allowed only 3 operations
* 1.Clear capture queue * 1.Clear capture queue
* 2.Clear capture filter * 2.Clear capture filter
...@@ -1007,7 +1011,6 @@ static long hfi1_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) ...@@ -1007,7 +1011,6 @@ static long hfi1_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
* Other are invalid. * Other are invalid.
*/ */
return -EINVAL; return -EINVAL;
}
spin_lock_irqsave(&dd->hfi1_snoop.snoop_lock, flags); spin_lock_irqsave(&dd->hfi1_snoop.snoop_lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment