if (len == 0)
                return 0;
 
-       input_buffer = kmalloc(len + 1, GFP_KERNEL);
-       if (!input_buffer)
-               return -ENOMEM;
+       input_buffer = memdup_user_nul(ubuf, len);
+       if (IS_ERR(input_buffer))
+               return PTR_ERR(input_buffer);
 
-       if (copy_from_user(input_buffer, ubuf, len)) {
-               status = -EFAULT;
-               goto out;
-       }
-
-       input_buffer[len] = '\0';
        DRM_DEBUG_DRIVER("Copied %d bytes from user\n", (unsigned int)len);
 
        drm_connector_list_iter_begin(dev, &conn_iter);
                }
        }
        drm_connector_list_iter_end(&conn_iter);
-out:
        kfree(input_buffer);
        if (status < 0)
                return status;
 
                return -E2BIG;
        }
 
-       tmpbuf = kmalloc(len + 1, GFP_KERNEL);
-       if (!tmpbuf)
-               return -ENOMEM;
-
-       if (copy_from_user(tmpbuf, ubuf, len)) {
-               ret = -EFAULT;
-               goto out;
-       }
-       tmpbuf[len] = '\0';
+       tmpbuf = memdup_user_nul(ubuf, len);
+       if (IS_ERR(tmpbuf))
+               return PTR_ERR(tmpbuf);
 
        ret = display_crc_ctl_parse(dev_priv, tmpbuf, len);
 
-out:
        kfree(tmpbuf);
        if (ret < 0)
                return ret;