if (!p->pointer || p->length != sizeof(struct ieee_param))
                return -EINVAL;
 
-       param = (struct ieee_param *)rtw_malloc(p->length);
-       if (!param)
-               return -ENOMEM;
-
-       if (copy_from_user(param, p->pointer, p->length)) {
-               kfree(param);
-               return -EFAULT;
-       }
+       param = memdup_user(p->pointer, p->length);
+       if (IS_ERR(param))
+               return PTR_ERR(param);
 
        switch (param->cmd) {
        case IEEE_CMD_SET_WPA_PARAM:
        if (!p->pointer || p->length != sizeof(struct ieee_param))
                return -EINVAL;
 
-       param = (struct ieee_param *)rtw_malloc(p->length);
-       if (!param)
-               return -ENOMEM;
-
-       if (copy_from_user(param, p->pointer, p->length)) {
-               kfree(param);
-               return -EFAULT;
-       }
+       param = memdup_user(p->pointer, p->length);
+       if (IS_ERR(param))
+               return PTR_ERR(param);
 
        switch (param->cmd) {
        case RTL871X_HOSTAPD_FLUSH: