summaryrefslogtreecommitdiff
path: root/drivers/comedi
diff options
context:
space:
mode:
authorIan Abbott <abbotti@mev.co.uk>2025-07-08 14:06:27 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-08-15 12:04:50 +0200
commit7dc9cd0585c22af97b2744feeec889d0c7a129a1 (patch)
tree86952fab83c5b8a27b8e20f1e99b4751fbd4833b /drivers/comedi
parentafc08b0b5587b553799bc375957706936a3e0088 (diff)
downloadlinux-7dc9cd0585c22af97b2744feeec889d0c7a129a1.tar.gz
linux-7dc9cd0585c22af97b2744feeec889d0c7a129a1.tar.bz2
linux-7dc9cd0585c22af97b2744feeec889d0c7a129a1.zip
comedi: comedi_test: Fix possible deletion of uninitialized timers
commit 1b98304c09a0192598d0767f1eb8c83d7e793091 upstream. In `waveform_common_attach()`, the two timers `&devpriv->ai_timer` and `&devpriv->ao_timer` are initialized after the allocation of the device private data by `comedi_alloc_devpriv()` and the subdevices by `comedi_alloc_subdevices()`. The function may return with an error between those function calls. In that case, `waveform_detach()` will be called by the Comedi core to clean up. The check that `waveform_detach()` uses to decide whether to delete the timers is incorrect. It only checks that the device private data was allocated, but that does not guarantee that the timers were initialized. It also needs to check that the subdevices were allocated. Fix it. Fixes: 73e0e4dfed4c ("staging: comedi: comedi_test: fix timer lock-up") Cc: stable@vger.kernel.org # 6.15+ Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Link: https://lore.kernel.org/r/20250708130627.21743-1-abbotti@mev.co.uk [ changed timer_delete_sync() to del_timer_sync() ] Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/comedi')
-rw-r--r--drivers/comedi/drivers/comedi_test.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/comedi/drivers/comedi_test.c b/drivers/comedi/drivers/comedi_test.c
index 626d53bf9146..aecb5f193be1 100644
--- a/drivers/comedi/drivers/comedi_test.c
+++ b/drivers/comedi/drivers/comedi_test.c
@@ -788,7 +788,7 @@ static void waveform_detach(struct comedi_device *dev)
{
struct waveform_private *devpriv = dev->private;
- if (devpriv) {
+ if (devpriv && dev->n_subdevices) {
del_timer_sync(&devpriv->ai_timer);
del_timer_sync(&devpriv->ao_timer);
}