]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ppdev: Add an error check in register_device
authorHuai-Yuan Liu <qq810974084@gmail.com>
Fri, 12 Apr 2024 08:38:40 +0000 (16:38 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 16 Jun 2024 11:39:39 +0000 (13:39 +0200)
[ Upstream commit fbf740aeb86a4fe82ad158d26d711f2f3be79b3e ]

In register_device, the return value of ida_simple_get is unchecked,
in witch ida_simple_get will use an invalid index value.

To address this issue, index should be checked after ida_simple_get. When
the index value is abnormal, a warning message should be printed, the port
should be dropped, and the value should be recorded.

Fixes: 9a69645dde11 ("ppdev: fix registering same device name")
Signed-off-by: Huai-Yuan Liu <qq810974084@gmail.com>
Link: https://lore.kernel.org/r/20240412083840.234085-1-qq810974084@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/char/ppdev.c

index f6024d97fe70b21aa917d4e548deaedbbe7392b1..a97edbf7455a64955eb7243eb0ee2ee39075f3f8 100644 (file)
@@ -296,28 +296,35 @@ static int register_device(int minor, struct pp_struct *pp)
        if (!port) {
                pr_warn("%s: no associated port!\n", name);
                rc = -ENXIO;
-               goto err;
+               goto err_free_name;
        }
 
        index = ida_alloc(&ida_index, GFP_KERNEL);
+       if (index < 0) {
+               pr_warn("%s: failed to get index!\n", name);
+               rc = index;
+               goto err_put_port;
+       }
+
        memset(&ppdev_cb, 0, sizeof(ppdev_cb));
        ppdev_cb.irq_func = pp_irq;
        ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
        ppdev_cb.private = pp;
        pdev = parport_register_dev_model(port, name, &ppdev_cb, index);
-       parport_put_port(port);
 
        if (!pdev) {
                pr_warn("%s: failed to register device!\n", name);
                rc = -ENXIO;
                ida_free(&ida_index, index);
-               goto err;
+               goto err_put_port;
        }
 
        pp->pdev = pdev;
        pp->index = index;
        dev_dbg(&pdev->dev, "registered pardevice\n");
-err:
+err_put_port:
+       parport_put_port(port);
+err_free_name:
        kfree(name);
        return rc;
 }