]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Staging: vt6656: potential memory corruption
authorDan Carpenter <dan.carpenter@oracle.com>
Thu, 29 Sep 2011 06:13:18 +0000 (09:13 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 30 Sep 2011 00:34:50 +0000 (17:34 -0700)
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>
drivers/staging/vt6656/wpactl.c

index 9216df01829e90e53ee8edd18b779800b6e0dbd5..2fa4f845a755fef71216cff48b9aeb79b60260a5 100644 (file)
@@ -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;