]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/hmcdrv: Replace kmalloc() + copy_from_user() with memdup_user_nul()
authorThorsten Blum <thorsten.blum@linux.dev>
Fri, 5 Sep 2025 11:02:23 +0000 (13:02 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 9 Sep 2025 13:03:13 +0000 (15:03 +0200)
Replace kmalloc() followed by copy_from_user() with memdup_user_nul() to
improve and simplify hmcdrv_dev_write(). Remove the manual
NUL-termination.

No functional changes intended.

Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
drivers/s390/char/hmcdrv_dev.c

index e069dd6858995eaee3db25bfeded4e3c7ad68cfc..b26fcf6849f2adc90d869f7e086e4c2037a8f969 100644 (file)
@@ -244,24 +244,17 @@ static ssize_t hmcdrv_dev_write(struct file *fp, const char __user *ubuf,
                                size_t len, loff_t *pos)
 {
        ssize_t retlen;
+       void *pdata;
 
        pr_debug("writing file '/dev/%pD' at pos. %lld with length %zd\n",
                 fp, (long long) *pos, len);
 
        if (!fp->private_data) { /* first expect a cmd write */
-               fp->private_data = kmalloc(len + 1, GFP_KERNEL);
-
-               if (!fp->private_data)
-                       return -ENOMEM;
-
-               if (!copy_from_user(fp->private_data, ubuf, len)) {
-                       ((char *)fp->private_data)[len] = '\0';
-                       return len;
-               }
-
-               kfree(fp->private_data);
-               fp->private_data = NULL;
-               return -EFAULT;
+               pdata = memdup_user_nul(ubuf, len);
+               if (IS_ERR(pdata))
+                       return PTR_ERR(pdata);
+               fp->private_data = pdata;
+               return len;
        }
 
        retlen = hmcdrv_dev_transfer((char *) fp->private_data,