Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | From | Huai-Yuan Liu <> | Subject | [PATCH V3] ppdev: Add an error check in register_device | Date | Sun, 7 Apr 2024 21:20:54 +0800 |
| |
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> --- V2: * In patch V2, we found that parport_find_number implicitly calls parport_get_port(). So when dealing with abnormal index values, we should call parport_put_port() to throw away the reference to the port. V3: * In patch V3, we made some additional adjustments to the jump labels, making the code more concise and readable. Thanks to Christophe JAILLET for helpful suggestion. --- drivers/char/ppdev.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c index 4c188e9e477c..276db589b901 100644 --- a/drivers/char/ppdev.c +++ b/drivers/char/ppdev.c @@ -296,28 +296,36 @@ 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_simple_get(&ida_index, 0, 0, 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_simple_remove(&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; } -- 2.34.1
| ![\](/images/icornerr.gif) |