patch "mei: bus: fix unlink on bus in error path" added to char-misc-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mei: bus: fix unlink on bus in error path
to my char-misc git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
in the char-misc-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From a43866856125c3c432e2fbb6cc63cee1539ec4a7 Mon Sep 17 00:00:00 2001
From: Alexander Usyskin <[email protected]>
Date: Tue, 13 Dec 2022 00:02:46 +0200
Subject: mei: bus: fix unlink on bus in error path
Unconditional call to mei_cl_unlink in mei_cl_bus_dev_release leads to call of the mei_cl_unlink without corresponding mei_cl_link. This leads to miscalculation of open_handle_count (decrease without increase).
Call unlink in mei_cldev_enable fail path and remove blanket unlink from mei_cl_bus_dev_release.
--- drivers/misc/mei/bus.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/misc/mei/bus.c +8 -4
@@ -702,13 +702,15 @@ void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t size)if (cl->state ==MEI_FILE_UNINITIALIZED ) { ret =mei_cl_link (cl);if (ret) - goto out; + goto notlinked;/* update pointers */ cl->cldev = cldev; } ret =mei_cl_dma_alloc_and_map (cl,NULL , buffer_id, size); -out: +if (ret) +mei_cl_unlink (cl); +notlinked:mutex_unlock (&bus->device_lock);if (ret)return ERR_PTR (ret);
@@ -758,7 +760,7 @@ int mei_cldev_enable(struct mei_cl_device *cldev)if (cl->state ==MEI_FILE_UNINITIALIZED ) { ret =mei_cl_link (cl);if (ret) - goto out; + goto notlinked;/* update pointers */ cl->cldev = cldev; }
@@ -785,6 +787,9 @@ int mei_cldev_enable(struct mei_cl_device *cldev) } out: +if (ret) +mei_cl_unlink (cl); +notlinked:mutex_unlock (&bus->device_lock);return ret;
@@ -1277,7 +1282,6 @@ static void mei_cl_bus_dev_release(struct device *dev)mei_cl_flush_queues (cldev->cl,NULL );mei_me_cl_put (cldev->me_cl);mei_dev_bus_put (cldev->bus); -mei_cl_unlink (cldev->cl);kfree (cldev->cl);kfree (cldev); }
Signature · 1 line
2.39.1