diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-19 19:35:20 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-19 19:35:20 -0800 |
commit | 4ec62b2b2e6bd7ddef7b6cea6e5db7b5578a6532 (patch) | |
tree | 90791e1b1cad55ba383973606bda88398d6c75c3 /drivers/scsi/megaraid/megaraid_sas.c | |
parent | 8386cda3f9faadcdcf0205ab6b84b03ce4ee1f6f (diff) | |
parent | b3dc1a212e5167984616445990c76056034f8eeb (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
[SCSI] megaraid_sas: fix for 32bit apps
[SCSI] fcoe: Only rmmod fcoe.ko if there are no active connections
[SCSI] libfcoe: Send port LKA every FIP_VN_KA_PERIOD secs.
[SCSI] libfc: Don't assume response request present.
[SCSI] libfc: Fix e_d_tov ns -> ms scaling factor in PLOGI response.
[SCSI] libfc: call ddp setup for only FCP reads to avoid accessing junk fsp pointer
[SCSI] iscsi_tcp regression: remove bogus warn on in write path
Diffstat (limited to 'drivers/scsi/megaraid/megaraid_sas.c')
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 708ea3157b6..d9b8ca5116b 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c @@ -3781,6 +3781,7 @@ static int megasas_mgmt_compat_ioctl_fw(struct file *file, unsigned long arg) compat_alloc_user_space(sizeof(struct megasas_iocpacket)); int i; int error = 0; + compat_uptr_t ptr; if (clear_user(ioc, sizeof(*ioc))) return -EFAULT; @@ -3793,9 +3794,22 @@ static int megasas_mgmt_compat_ioctl_fw(struct file *file, unsigned long arg) copy_in_user(&ioc->sge_count, &cioc->sge_count, sizeof(u32))) return -EFAULT; - for (i = 0; i < MAX_IOCTL_SGE; i++) { - compat_uptr_t ptr; + /* + * The sense_ptr is used in megasas_mgmt_fw_ioctl only when + * sense_len is not null, so prepare the 64bit value under + * the same condition. + */ + if (ioc->sense_len) { + void __user **sense_ioc_ptr = + (void __user **)(ioc->frame.raw + ioc->sense_off); + compat_uptr_t *sense_cioc_ptr = + (compat_uptr_t *)(cioc->frame.raw + cioc->sense_off); + if (get_user(ptr, sense_cioc_ptr) || + put_user(compat_ptr(ptr), sense_ioc_ptr)) + return -EFAULT; + } + for (i = 0; i < MAX_IOCTL_SGE; i++) { if (get_user(ptr, &cioc->sgl[i].iov_base) || put_user(compat_ptr(ptr), &ioc->sgl[i].iov_base) || copy_in_user(&ioc->sgl[i].iov_len, |