Replace kcalloc + copy_from_user with memdup_user. Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@igalia.com> --- .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 173 ++++++------------ 1 file changed, 61 insertions(+), 112 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index f263e1a4537e..3a348e868f5d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c @@ -74,8 +74,7 @@ static const char *const mst_progress_status[] = { * */ static int parse_write_buffer_into_params(char *wr_buf, uint32_t wr_buf_size, - long *param, const char __user *buf, - int max_param_num, + long *param, int max_param_num, uint8_t *param_nums) { char *wr_buf_ptr = NULL; @@ -89,12 +88,6 @@ static int parse_write_buffer_into_params(char *wr_buf, uint32_t wr_buf_size, wr_buf_ptr = wr_buf; - /* r is bytes not be copied */ - if (copy_from_user(wr_buf_ptr, buf, wr_buf_size)) { - DRM_DEBUG_DRIVER("user data could not be read successfully\n"); - return -EFAULT; - } - /* check number of parameters. isspace could not differ space and \n */ while ((*wr_buf_ptr != 0xa) && (wr_buf_count < wr_buf_size)) { /* skip space*/ @@ -261,25 +254,23 @@ static ssize_t dp_link_settings_write(struct file *f, const char __user *buf, struct amdgpu_device *adev = drm_to_adev(connector->base.dev); struct dc *dc = (struct dc *)link->dc; struct dc_link_settings prefer_link_settings = {0}; - char *wr_buf = NULL; const uint32_t wr_buf_size = 40; /* 0: lane_count; 1: link_rate */ int max_param_num = 2; uint8_t param_nums = 0; long param[2]; + char *wr_buf; bool valid_input = true; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - if (!wr_buf) - return -ENOSPC; + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -392,12 +383,12 @@ static ssize_t dp_mst_link_setting(struct file *f, const char __user *buf, struct amdgpu_device *adev = drm_to_adev(aconnector->base.dev); struct dc *dc = (struct dc *)link->dc; struct dc_link_settings prefer_link_settings = {0}; - char *wr_buf = NULL; const uint32_t wr_buf_size = 40; /* 0: lane_count; 1: link_rate */ int max_param_num = 2; uint8_t param_nums = 0; long param[2]; + char *wr_buf; bool valid_input = true; if (!dp_mst_is_end_device(aconnector)) @@ -406,14 +397,12 @@ static ssize_t dp_mst_link_setting(struct file *f, const char __user *buf, if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - if (!wr_buf) - return -ENOSPC; + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -611,27 +600,25 @@ static ssize_t dp_phy_settings_write(struct file *f, const char __user *buf, struct amdgpu_dm_connector *connector = file_inode(f)->i_private; struct dc_link *link = connector->dc_link; struct dc *dc = (struct dc *)link->dc; - char *wr_buf = NULL; uint32_t wr_buf_size = 40; long param[3]; bool use_prefer_link_setting; struct link_training_settings link_lane_settings = {0}; int max_param_num = 3; uint8_t param_nums = 0; + char *wr_buf; int r = 0; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - if (!wr_buf) - return -ENOSPC; + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -753,7 +740,6 @@ static ssize_t dp_phy_test_pattern_debugfs_write(struct file *f, const char __us { struct amdgpu_dm_connector *connector = file_inode(f)->i_private; struct dc_link *link = connector->dc_link; - char *wr_buf = NULL; uint32_t wr_buf_size = 100; long param[11] = {0x0}; int max_param_num = 11; @@ -771,19 +757,18 @@ static ssize_t dp_phy_test_pattern_debugfs_write(struct file *f, const char __us struct dc_link_settings cur_link_settings = {LANE_COUNT_UNKNOWN, LINK_RATE_UNKNOWN, LINK_SPREAD_DISABLED}; struct link_training_settings link_training_settings = {0}; + char *wr_buf; int i; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - if (!wr_buf) - return -ENOSPC; + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -1198,25 +1183,21 @@ static ssize_t dp_dsc_passthrough_set(struct file *f, const char __user *buf, size_t size, loff_t *pos) { struct amdgpu_dm_connector *aconnector = file_inode(f)->i_private; - char *wr_buf = NULL; uint32_t wr_buf_size = 42; int max_param_num = 1; long param; uint8_t param_nums = 0; + char *wr_buf; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - - if (!wr_buf) { - DRM_DEBUG_DRIVER("no memory to allocate write buffer\n"); - return -ENOSPC; - } + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - ¶m, buf, - max_param_num, + ¶m, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -1438,12 +1419,12 @@ static ssize_t trigger_hotplug(struct file *f, const char __user *buf, struct drm_device *dev = connector->dev; struct amdgpu_device *adev = drm_to_adev(dev); enum dc_connection_type new_connection_type = dc_connection_none; - char *wr_buf = NULL; uint32_t wr_buf_size = 42; int max_param_num = 1; long param[1] = {0}; uint8_t param_nums = 0; bool ret = false; + char *wr_buf; if (!aconnector->dc_link) return -EINVAL; @@ -1451,17 +1432,12 @@ static ssize_t trigger_hotplug(struct file *f, const char __user *buf, if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - - if (!wr_buf) { - DRM_DEBUG_DRIVER("no memory to allocate write buffer\n"); - return -ENOSPC; - } + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -1639,26 +1615,21 @@ static ssize_t dp_dsc_clock_en_write(struct file *f, const char __user *buf, struct dm_crtc_state *dm_crtc_state = NULL; struct pipe_ctx *pipe_ctx; int i; - char *wr_buf = NULL; uint32_t wr_buf_size = 42; int max_param_num = 1; long param[1] = {0}; uint8_t param_nums = 0; + char *wr_buf; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - - if (!wr_buf) { - DRM_DEBUG_DRIVER("no memory to allocate write buffer\n"); - return -ENOSPC; - } + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -1823,26 +1794,21 @@ static ssize_t dp_dsc_slice_width_write(struct file *f, const char __user *buf, struct drm_crtc *crtc = NULL; struct dm_crtc_state *dm_crtc_state = NULL; int i; - char *wr_buf = NULL; uint32_t wr_buf_size = 42; int max_param_num = 1; long param[1] = {0}; uint8_t param_nums = 0; + char *wr_buf; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - - if (!wr_buf) { - DRM_DEBUG_DRIVER("no memory to allocate write buffer\n"); - return -ENOSPC; - } + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -2007,26 +1973,21 @@ static ssize_t dp_dsc_slice_height_write(struct file *f, const char __user *buf, struct dm_crtc_state *dm_crtc_state = NULL; struct pipe_ctx *pipe_ctx; int i; - char *wr_buf = NULL; uint32_t wr_buf_size = 42; int max_param_num = 1; uint8_t param_nums = 0; long param[1] = {0}; + char *wr_buf; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - - if (!wr_buf) { - DRM_DEBUG_DRIVER("no memory to allocate write buffer\n"); - return -ENOSPC; - } + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -2184,26 +2145,21 @@ static ssize_t dp_dsc_bits_per_pixel_write(struct file *f, const char __user *bu struct dm_crtc_state *dm_crtc_state = NULL; struct pipe_ctx *pipe_ctx; int i; - char *wr_buf = NULL; uint32_t wr_buf_size = 42; int max_param_num = 1; uint8_t param_nums = 0; long param[1] = {0}; + char *wr_buf; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - - if (!wr_buf) { - DRM_DEBUG_DRIVER("no memory to allocate write buffer\n"); - return -ENOSPC; - } + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -2612,26 +2568,21 @@ static ssize_t dp_max_bpc_write(struct file *f, const char __user *buf, struct drm_connector *connector = &aconnector->base; struct dm_connector_state *state; struct drm_device *dev = connector->dev; - char *wr_buf = NULL; uint32_t wr_buf_size = 42; int max_param_num = 1; long param[1] = {0}; uint8_t param_nums = 0; + char *wr_buf; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - - if (!wr_buf) { - DRM_DEBUG_DRIVER("no memory to allocate write buffer\n"); - return -ENOSPC; - } + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } @@ -3433,25 +3384,23 @@ static ssize_t edp_ilr_write(struct file *f, const char __user *buf, struct amdgpu_device *adev = drm_to_adev(connector->base.dev); struct dc *dc = (struct dc *)link->dc; struct dc_link_settings prefer_link_settings; - char *wr_buf = NULL; const uint32_t wr_buf_size = 40; /* 0: lane_count; 1: link_rate */ int max_param_num = 2; uint8_t param_nums = 0; long param[2]; bool valid_input = true; + char *wr_buf; if (size == 0) return -EINVAL; - wr_buf = kcalloc(wr_buf_size, sizeof(char), GFP_KERNEL); - if (!wr_buf) - return -ENOMEM; + wr_buf = memdup_user(buf, wr_buf_size); + if (IS_ERR(wr_buf)) + return PTR_ERR(wr_buf); if (parse_write_buffer_into_params(wr_buf, wr_buf_size, - (long *)param, buf, - max_param_num, - ¶m_nums)) { + param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; } -- 2.48.0