diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2011-09-29 06:13:18 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-30 00:34:50 (GMT) |
commit | 657d1b0dfc97e2256257320f0818e21cf360d0ce (patch) | |
tree | da2e92e4dd3c3e5d5d7b53098b20b51040e24cc2 /drivers/staging/vt6656 | |
parent | 6835cb6b438b77ba82ad5a23944bbfb12128f5db (diff) | |
download | linux-657d1b0dfc97e2256257320f0818e21cf360d0ce.tar.xz |
Staging: vt6656: potential memory corruption
param->u.wpa_key.key_len comes from the user. If it's too large we
would write past the end of the array.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/vt6656')
-rw-r--r-- | drivers/staging/vt6656/wpactl.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/staging/vt6656/wpactl.c b/drivers/staging/vt6656/wpactl.c index 9216df0..2fa4f84 100644 --- a/drivers/staging/vt6656/wpactl.c +++ b/drivers/staging/vt6656/wpactl.c @@ -229,6 +229,9 @@ int wpa_set_wpadev(PSDevice pDevice, int val) return ret; } + if (param->u.wpa_key.key && param->u.wpa_key.key_len > sizeof(abyKey)) + return -EINVAL; + spin_unlock_irq(&pDevice->lock); if(param->u.wpa_key.key && fcpfkernel) { memcpy(&abyKey[0], param->u.wpa_key.key, param->u.wpa_key.key_len); @@ -269,6 +272,10 @@ int wpa_set_wpadev(PSDevice pDevice, int val) return ret; } + + if (param->u.wpa_key.seq && param->u.wpa_key.seq_len > sizeof(abySeq)) + return -EINVAL; + spin_unlock_irq(&pDevice->lock); if(param->u.wpa_key.seq && fcpfkernel) { memcpy(&abySeq[0], param->u.wpa_key.seq, param->u.wpa_key.seq_len); @@ -772,9 +779,14 @@ static int wpa_set_associate(PSDevice pDevice, DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wpa_ie_len = %d\n", param->u.wpa_associate.wpa_ie_len); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Roaming dBm = %d\n", param->u.wpa_associate.roam_dbm); //Davidwang - if (param->u.wpa_associate.wpa_ie && - copy_from_user(&abyWPAIE[0], param->u.wpa_associate.wpa_ie, param->u.wpa_associate.wpa_ie_len)) - return -EINVAL; + if (param->u.wpa_associate.wpa_ie) { + if (param->u.wpa_associate.wpa_ie_len > sizeof(abyWPAIE)) + return -EINVAL; + + if (copy_from_user(&abyWPAIE[0], param->u.wpa_associate.wpa_ie, + param->u.wpa_associate.wpa_ie_len)) + return -EFAULT; + } if (param->u.wpa_associate.mode == 1) pMgmt->eConfigMode = WMAC_CONFIG_IBSS_STA; |