int iwctl_siwgenie(struct net_device *dev,
                   struct iw_request_info *info,
                   struct iw_point *wrq,
-                  char *extra)
+                  char __user *extra)
 {
        PSDevice                        pDevice = (PSDevice)netdev_priv(dev);
        PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);
        int ret = 0;
+       char length;
 
        if (wrq->length) {
-               if ((wrq->length < 2) || (extra[1]+2 != wrq->length)) {
-                       ret = -EINVAL;
-                       goto out;
-               }
+               if (wrq->length < 2)
+                       return -EINVAL;
+
+               ret = get_user(length, extra + 1);
+               if (ret)
+                       return ret;
+
+               if (length + 2 != wrq->length)
+                       return -EINVAL;
+
                if (wrq->length > MAX_WPA_IE_LEN) {
                        ret = -ENOMEM;
                        goto out;
 int iwctl_giwgenie(struct net_device *dev,
                   struct iw_request_info *info,
                   struct iw_point *wrq,
-                  char *extra)
+                  char __user *extra)
 {
        PSDevice                        pDevice = (PSDevice)netdev_priv(dev);
        PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);
 int iwctl_siwmlme(struct net_device *dev,
                  struct iw_request_info *info,
                  struct iw_point *wrq,
-                 char *extra)
+                 char __user *extra)
 {
        PSDevice                        pDevice = (PSDevice)netdev_priv(dev);
        PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);
-       struct iw_mlme *mlme = (struct iw_mlme *)extra;
+       struct iw_mlme mime;
+
        int ret = 0;
 
-       if (memcmp(pMgmt->abyCurrBSSID, mlme->addr.sa_data, ETH_ALEN)) {
+       ret = copy_from_user(&mime, extra, sizeof(mime));
+       if (ret)
+               return -EFAULT;
+
+       if (memcmp(pMgmt->abyCurrBSSID, mime.addr.sa_data, ETH_ALEN)) {
                ret = -EINVAL;
                return ret;
        }
-       switch (mlme->cmd) {
+       switch (mime.cmd) {
        case IW_MLME_DEAUTH:
                //this command seems to be not complete,please test it --einsnliu
                //bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (unsigned char *)&reason);
 
 int iwctl_siwgenie(struct net_device *dev,
                   struct iw_request_info *info,
                   struct iw_point *wrq,
-                  char *extra);
+                  char __user *extra);
 
 int iwctl_giwgenie(struct net_device *dev,
                   struct iw_request_info *info,
                   struct iw_point *wrq,
-                  char *extra);
+                  char __user *extra);
 
 int iwctl_siwencodeext(struct net_device *dev,
                       struct iw_request_info *info,
 int iwctl_siwmlme(struct net_device *dev,
                  struct iw_request_info *info,
                  struct iw_point *wrq,
-                 char *extra);
+                 char __user *extra);
 #endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
 //End Add -- //2008-0409-07, <Add> by Einsn Liu