drm/vmwgfx: Use memdup_user() rather than duplicating its implementation
* Reuse existing functionality from memdup_user() instead of keeping duplicate source code. * Try this copy operation before allocating memory for the data structure member "offsets". * Delete the local variable "user_sizes" which became unnecessary with this refactoring. Signed-off-by: Markus Elfring <elfring@users.sourceforge.net> Reviewed-by: Sinclair Yeh <syeh@vmware.com> Signed-off-by: Sinclair Yeh <syeh@vmware.com>
This commit is contained in:
parent
7ed3b39432
commit
c138d03f1b
|
@ -700,7 +700,6 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
|
|||
struct drm_vmw_surface_create_req *req = &arg->req;
|
||||
struct drm_vmw_surface_arg *rep = &arg->rep;
|
||||
struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
|
||||
struct drm_vmw_size __user *user_sizes;
|
||||
int ret;
|
||||
int i, j;
|
||||
uint32_t cur_bo_offset;
|
||||
|
@ -763,11 +762,11 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
|
|||
memcpy(srf->mip_levels, req->mip_levels, sizeof(srf->mip_levels));
|
||||
srf->num_sizes = num_sizes;
|
||||
user_srf->size = size;
|
||||
srf->sizes = kmalloc_array(srf->num_sizes,
|
||||
sizeof(*srf->sizes),
|
||||
GFP_KERNEL);
|
||||
if (unlikely(srf->sizes == NULL)) {
|
||||
ret = -ENOMEM;
|
||||
srf->sizes = memdup_user((struct drm_vmw_size __user *)(unsigned long)
|
||||
req->size_addr,
|
||||
sizeof(*srf->sizes) * srf->num_sizes);
|
||||
if (IS_ERR(srf->sizes)) {
|
||||
ret = PTR_ERR(srf->sizes);
|
||||
goto out_no_sizes;
|
||||
}
|
||||
srf->offsets = kmalloc_array(srf->num_sizes,
|
||||
|
@ -778,16 +777,6 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
|
|||
goto out_no_offsets;
|
||||
}
|
||||
|
||||
user_sizes = (struct drm_vmw_size __user *)(unsigned long)
|
||||
req->size_addr;
|
||||
|
||||
ret = copy_from_user(srf->sizes, user_sizes,
|
||||
srf->num_sizes * sizeof(*srf->sizes));
|
||||
if (unlikely(ret != 0)) {
|
||||
ret = -EFAULT;
|
||||
goto out_no_copy;
|
||||
}
|
||||
|
||||
srf->base_size = *srf->sizes;
|
||||
srf->autogen_filter = SVGA3D_TEX_FILTER_NONE;
|
||||
srf->multisample_count = 0;
|
||||
|
|
Loading…
Reference in New Issue