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,
-                                          &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                          &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                          &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                          &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                          &param, buf,
-                                          max_param_num,
+                                          &param, max_param_num,
                                           &param_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,
-                                               &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                           &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                           &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                           &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                           &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                          &param_nums)) {
+                                          param, max_param_num, &param_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,
-                                          &param_nums)) {
+                                          param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
        }
-- 
2.48.0

Reply via email to