]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tty: vcc: Add check for kstrdup() in vcc_probe()
authorYi Yang <yiyang13@huawei.com>
Mon, 4 Sep 2023 03:52:20 +0000 (11:52 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 18 Sep 2023 09:14:42 +0000 (11:14 +0200)
Add check for the return value of kstrdup() and return the error, if it
fails in order to avoid NULL pointer dereference.

Signed-off-by: Yi Yang <yiyang13@huawei.com>
Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
Link: https://lore.kernel.org/r/20230904035220.48164-1-yiyang13@huawei.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vcc.c

index a39ed981bfd3e4488bbeea49ada9ac33cb099652..5b625f20233b4782cd5d5ff99b14ec5740009304 100644 (file)
@@ -579,18 +579,22 @@ static int vcc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
                return -ENOMEM;
 
        name = kstrdup(dev_name(&vdev->dev), GFP_KERNEL);
+       if (!name) {
+               rv = -ENOMEM;
+               goto free_port;
+       }
 
        rv = vio_driver_init(&port->vio, vdev, VDEV_CONSOLE_CON, vcc_versions,
                             ARRAY_SIZE(vcc_versions), NULL, name);
        if (rv)
-               goto free_port;
+               goto free_name;
 
        port->vio.debug = vcc_dbg_vio;
        vcc_ldc_cfg.debug = vcc_dbg_ldc;
 
        rv = vio_ldc_alloc(&port->vio, &vcc_ldc_cfg, port);
        if (rv)
-               goto free_port;
+               goto free_name;
 
        spin_lock_init(&port->lock);
 
@@ -624,6 +628,11 @@ static int vcc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
                goto unreg_tty;
        }
        port->domain = kstrdup(domain, GFP_KERNEL);
+       if (!port->domain) {
+               rv = -ENOMEM;
+               goto unreg_tty;
+       }
+
 
        mdesc_release(hp);
 
@@ -653,8 +662,9 @@ free_table:
        vcc_table_remove(port->index);
 free_ldc:
        vio_ldc_free(&port->vio);
-free_port:
+free_name:
        kfree(name);
+free_port:
        kfree(port);
 
        return rv;