* [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace
@ 2026-09-09 10:48 Yogesh Gaur
2026-09-09 10:48 ` [PATCH 1/6] comedi: comedi_parport: validate the IRQ " Yogesh Gaur
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Yogesh Gaur @ 2026-09-09 10:48 UTC (permalink / raw)
To: Ian Abbott, H Hartley Sweeten
Cc: Greg Kroah-Hartman, linux-kernel, Yogesh Gaur,
syzbot+690d666eb12fca6e1e61
comedi boards are configured through the COMEDI_DEVCONFIG ioctl, which
lets userspace pick the interrupt line for ISA-style boards. Fourteen
drivers hand that value to request_irq(); eight bound it to the
interrupts the board can actually assert first, six do not.
On x86 an unbounded value can name an interrupt that belongs to the
IO-APIC GSI domain of a PCI device. request_irq() succeeds and
register_handler_proc() creates /proc/irq/<n>/<board>. When that PCI
device is later unbound, mp_unmap_irq() drops mp_chip_data->count to
zero and frees the descriptor from under the still-installed comedi
handler:
remove_proc_entry: removing non-empty directory 'irq/20', leaking at least 'comedi_parport'
WARNING: fs/proc/generic.c:747 at remove_proc_entry+0x4e7/0x610 fs/proc/generic.c:747
Call Trace:
<TASK>
unregister_irq_proc+0x206/0x2a0 kernel/irq/proc.c:406
free_desc+0x89/0x330 kernel/irq/irqdesc.c:482
irq_free_descs+0x84/0xc0 kernel/irq/irqdesc.c:865
irq_domain_free_irqs+0x46a/0x5c0 kernel/irq/irqdomain.c:1917
mp_unmap_irq+0xf8/0x130 arch/x86/kernel/apic/io_apic.c:1061
acpi_unregister_gsi_ioapic+0x40/0x60 arch/x86/kernel/acpi/boot.c:722
acpi_pci_irq_disable+0x275/0x360 drivers/acpi/pci_irq.c:517
pci_disable_device+0x130/0x270 drivers/pci/pci.c:2206
pci_device_remove+0xb2/0x1d0 drivers/pci/pci-driver.c:512
device_release_driver_internal+0x44e/0x620 drivers/base/dd.c:1372
unbind_store+0xf8/0x110 drivers/base/bus.c:244
</TASK>
The leaked /proc entry the warning names is the mild part.
mp_chip_data->count tracks GSI mappings rather than request_irq() users,
and __setup_irq() takes no reference on the descriptor, so the irq_desc
is freed with the comedi irqaction still attached to it.
Restricting the value to the ISA range is enough to close this:
mp_chip_data->isa_irq is set only by alloc_isa_irq_from_domain(), and
mp_unmap_irq() returns early when it is set, so a legacy interrupt can
never be freed out from under a requester. It also costs nothing real,
since every affected driver is for an ISA or PC/104 board.
Each patch bounds one driver, following the check das16m1.c already has.
Where the driver documents which interrupts its board can assert, that
set is used; otherwise the bound is the plain 1-15 ISA range. As in
das16m1.c an out-of-range value is ignored rather than rejected, so the
board still attaches without interrupt support -- the same thing that
happens today when request_irq() fails.
syzbot found this through comedi_parport, fixed by patch 1. The other
five are the same bug reachable the same way; I have no reproducer for
those, they came out of auditing the callers.
I have none of this hardware, so the change is by inspection only.
Reported-by: syzbot+690d666eb12fca6e1e61@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=690d666eb12fca6e1e61
Yogesh Gaur (6):
comedi: comedi_parport: validate the IRQ supplied by userspace
comedi: ni_atmio16d: validate the IRQ supplied by userspace
comedi: dt2814: validate the IRQ supplied by userspace
comedi: dmm32at: validate the IRQ supplied by userspace
comedi: pcmmio: validate the IRQ supplied by userspace
comedi: pcmuio: validate the IRQs supplied by userspace
drivers/comedi/drivers/comedi_parport.c | 3 ++-
drivers/comedi/drivers/dmm32at.c | 3 ++-
drivers/comedi/drivers/dt2814.c | 3 ++-
drivers/comedi/drivers/ni_atmio16d.c | 4 +++-
drivers/comedi/drivers/pcmmio.c | 3 ++-
drivers/comedi/drivers/pcmuio.c | 5 +++--
6 files changed, 14 insertions(+), 7 deletions(-)
--
2.55.0.windows.5
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/6] comedi: comedi_parport: validate the IRQ supplied by userspace
2026-09-09 10:48 [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace Yogesh Gaur
@ 2026-09-09 10:48 ` Yogesh Gaur
2026-09-09 10:48 ` [PATCH 2/6] comedi: ni_atmio16d: " Yogesh Gaur
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Yogesh Gaur @ 2026-09-09 10:48 UTC (permalink / raw)
To: Ian Abbott, H Hartley Sweeten
Cc: Greg Kroah-Hartman, linux-kernel, Yogesh Gaur,
syzbot+690d666eb12fca6e1e61
comedi boards are configured through the COMEDI_DEVCONFIG ioctl, so
it->options[1] is a number chosen by userspace. comedi_parport passes it to
request_irq() without checking it first, which lets an interrupt owned by
another irqdomain -- a PCI device's IO-APIC GSI, for instance -- be
claimed for this board. When the owner of that interrupt is later
released the descriptor is freed while this driver's handler is still
installed on it.
A parallel port asserts a legacy ISA interrupt, so the ISA range is the
right bound; it is also sufficient, because mp_chip_data->isa_irq is set
only by alloc_isa_irq_from_domain() and mp_unmap_irq() returns early when
it is set.
syzbot hit this one:
remove_proc_entry: removing non-empty directory 'irq/20', leaking at least 'comedi_parport'
WARNING: fs/proc/generic.c:747 at remove_proc_entry+0x4e7/0x610 fs/proc/generic.c:747
Call Trace:
<TASK>
unregister_irq_proc+0x206/0x2a0 kernel/irq/proc.c:406
free_desc+0x89/0x330 kernel/irq/irqdesc.c:482
irq_free_descs+0x84/0xc0 kernel/irq/irqdesc.c:865
irq_domain_free_irqs+0x46a/0x5c0 kernel/irq/irqdomain.c:1917
mp_unmap_irq+0xf8/0x130 arch/x86/kernel/apic/io_apic.c:1061
acpi_unregister_gsi_ioapic+0x40/0x60 arch/x86/kernel/acpi/boot.c:722
acpi_pci_irq_disable+0x275/0x360 drivers/acpi/pci_irq.c:517
pci_disable_device+0x130/0x270 drivers/pci/pci.c:2206
pci_device_remove+0xb2/0x1d0 drivers/pci/pci-driver.c:512
device_release_driver_internal+0x44e/0x620 drivers/base/dd.c:1372
unbind_store+0xf8/0x110 drivers/base/bus.c:244
</TASK>
The leaked /proc entry the warning names is the mild part.
mp_chip_data->count tracks GSI mappings rather than request_irq() users,
and __setup_irq() takes no reference on the descriptor, so the irq_desc
is freed with the comedi irqaction still attached to it.
Bound the value before requesting it, as das16m1.c already does. An
out-of-range value is ignored rather than rejected, so the board still
attaches without interrupt support, exactly as it does today when
request_irq() fails.
Fixes: 241ab6ad7108 ("Staging: comedi: add comedi_parport driver")
Reported-by: syzbot+690d666eb12fca6e1e61@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=690d666eb12fca6e1e61
Assisted-by: LLM
Signed-off-by: Yogesh Gaur <yogeshgaur.83@gmail.com>
---
drivers/comedi/drivers/comedi_parport.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/comedi/drivers/comedi_parport.c b/drivers/comedi/drivers/comedi_parport.c
index 57ee3f9dfba2..94284ff157ac 100644
--- a/drivers/comedi/drivers/comedi_parport.c
+++ b/drivers/comedi/drivers/comedi_parport.c
@@ -243,7 +243,8 @@ static int parport_attach(struct comedi_device *dev,
outb(0, dev->iobase + PARPORT_DATA_REG);
outb(0, dev->iobase + PARPORT_CTRL_REG);
- if (it->options[1]) {
+ /* only ISA interrupts are valid on a parallel port */
+ if (it->options[1] >= 1 && it->options[1] <= 15) {
ret = request_irq(it->options[1], parport_interrupt, 0,
dev->board_name, dev);
if (ret == 0)
--
2.55.0.windows.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/6] comedi: ni_atmio16d: validate the IRQ supplied by userspace
2026-09-09 10:48 [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace Yogesh Gaur
2026-09-09 10:48 ` [PATCH 1/6] comedi: comedi_parport: validate the IRQ " Yogesh Gaur
@ 2026-09-09 10:48 ` Yogesh Gaur
2026-09-09 10:48 ` [PATCH 3/6] comedi: dt2814: " Yogesh Gaur
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Yogesh Gaur @ 2026-09-09 10:48 UTC (permalink / raw)
To: Ian Abbott, H Hartley Sweeten
Cc: Greg Kroah-Hartman, linux-kernel, Yogesh Gaur
comedi boards are configured through the COMEDI_DEVCONFIG ioctl, so
it->options[1] is a number chosen by userspace. ni_atmio16d passes it to
request_irq() without checking it first, which lets an interrupt owned by
another irqdomain -- a PCI device's IO-APIC GSI, for instance -- be
claimed for this board. When the owner of that interrupt is later
released the descriptor is freed while this driver's handler is still
installed on it.
The driver already documents which interrupts the board can assert --
"0 == no irq; or 3,4,5,6,7,9,10,11,12,14,15" -- so use exactly that set
rather than the whole ISA range.
Bound the value before requesting it, as das16m1.c already does. An
out-of-range value is ignored rather than rejected, so the board still
attaches without interrupt support, exactly as it does today when
request_irq() fails.
Fixes: 2323b276308a ("Staging: comedi: add ni_at_atmio16d driver")
Assisted-by: LLM
Signed-off-by: Yogesh Gaur <yogeshgaur.83@gmail.com>
---
drivers/comedi/drivers/ni_atmio16d.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/comedi/drivers/ni_atmio16d.c b/drivers/comedi/drivers/ni_atmio16d.c
index 6765cdc276ca..87fed16b112c 100644
--- a/drivers/comedi/drivers/ni_atmio16d.c
+++ b/drivers/comedi/drivers/ni_atmio16d.c
@@ -593,7 +593,9 @@ static int atmio16d_attach(struct comedi_device *dev,
/* reset the atmio16d hardware */
reset_atmio16d(dev);
- if (it->options[1]) {
+ /* only irqs 3, 4, 5, 6, 7, 9, 10, 11, 12, 14, and 15 are valid */
+ if (it->options[1] >= 3 && it->options[1] <= 15 &&
+ (1 << it->options[1]) & 0xdef8) {
ret = request_irq(it->options[1], atmio16d_interrupt, 0,
dev->board_name, dev);
if (ret == 0)
--
2.55.0.windows.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/6] comedi: dt2814: validate the IRQ supplied by userspace
2026-09-09 10:48 [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace Yogesh Gaur
2026-09-09 10:48 ` [PATCH 1/6] comedi: comedi_parport: validate the IRQ " Yogesh Gaur
2026-09-09 10:48 ` [PATCH 2/6] comedi: ni_atmio16d: " Yogesh Gaur
@ 2026-09-09 10:48 ` Yogesh Gaur
2026-09-09 10:48 ` [PATCH 4/6] comedi: dmm32at: " Yogesh Gaur
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Yogesh Gaur @ 2026-09-09 10:48 UTC (permalink / raw)
To: Ian Abbott, H Hartley Sweeten
Cc: Greg Kroah-Hartman, linux-kernel, Yogesh Gaur
comedi boards are configured through the COMEDI_DEVCONFIG ioctl, so
it->options[1] is a number chosen by userspace. dt2814 passes it to
request_irq() without checking it first, which lets an interrupt owned by
another irqdomain -- a PCI device's IO-APIC GSI, for instance -- be
claimed for this board. When the owner of that interrupt is later
released the descriptor is freed while this driver's handler is still
installed on it.
Every interrupt this board can assert is a legacy ISA one, so the ISA
range is the right bound; it is also sufficient, because
mp_chip_data->isa_irq is set only by alloc_isa_irq_from_domain() and
mp_unmap_irq() returns early when it is set.
Bound the value before requesting it, as das16m1.c already does. An
out-of-range value is ignored rather than rejected, so the board still
attaches without interrupt support, exactly as it does today when
request_irq() fails.
Fixes: a211ea977a41 ("Staging: comedi: add dt2814 driver")
Assisted-by: LLM
Signed-off-by: Yogesh Gaur <yogeshgaur.83@gmail.com>
---
drivers/comedi/drivers/dt2814.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/comedi/drivers/dt2814.c b/drivers/comedi/drivers/dt2814.c
index caec16482afb..63b7f17691ff 100644
--- a/drivers/comedi/drivers/dt2814.c
+++ b/drivers/comedi/drivers/dt2814.c
@@ -316,7 +316,8 @@ static int dt2814_attach(struct comedi_device *dev, struct comedi_devconfig *it)
return -EIO;
}
- if (it->options[1]) {
+ /* only ISA interrupts are valid on this board */
+ if (it->options[1] >= 1 && it->options[1] <= 15) {
ret = request_irq(it->options[1], dt2814_interrupt, 0,
dev->board_name, dev);
if (ret == 0)
--
2.55.0.windows.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/6] comedi: dmm32at: validate the IRQ supplied by userspace
2026-09-09 10:48 [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace Yogesh Gaur
` (2 preceding siblings ...)
2026-09-09 10:48 ` [PATCH 3/6] comedi: dt2814: " Yogesh Gaur
@ 2026-09-09 10:48 ` Yogesh Gaur
2026-09-09 10:48 ` [PATCH 5/6] comedi: pcmmio: " Yogesh Gaur
2026-09-09 10:48 ` [PATCH 6/6] comedi: pcmuio: validate the IRQs " Yogesh Gaur
5 siblings, 0 replies; 7+ messages in thread
From: Yogesh Gaur @ 2026-09-09 10:48 UTC (permalink / raw)
To: Ian Abbott, H Hartley Sweeten
Cc: Greg Kroah-Hartman, linux-kernel, Yogesh Gaur
comedi boards are configured through the COMEDI_DEVCONFIG ioctl, so
it->options[1] is a number chosen by userspace. dmm32at passes it to
request_irq() without checking it first, which lets an interrupt owned by
another irqdomain -- a PCI device's IO-APIC GSI, for instance -- be
claimed for this board. When the owner of that interrupt is later
released the descriptor is freed while this driver's handler is still
installed on it.
Every interrupt this board can assert is a legacy ISA one, so the ISA
range is the right bound; it is also sufficient, because
mp_chip_data->isa_irq is set only by alloc_isa_irq_from_domain() and
mp_unmap_irq() returns early when it is set.
Bound the value before requesting it, as das16m1.c already does. An
out-of-range value is ignored rather than rejected, so the board still
attaches without interrupt support, exactly as it does today when
request_irq() fails.
Fixes: 3c501880ac44 ("Staging: comedi: add dmm32at driver")
Assisted-by: LLM
Signed-off-by: Yogesh Gaur <yogeshgaur.83@gmail.com>
---
drivers/comedi/drivers/dmm32at.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/comedi/drivers/dmm32at.c b/drivers/comedi/drivers/dmm32at.c
index d1d9f75e168f..c6a6ba2899e6 100644
--- a/drivers/comedi/drivers/dmm32at.c
+++ b/drivers/comedi/drivers/dmm32at.c
@@ -600,7 +600,8 @@ static int dmm32at_attach(struct comedi_device *dev,
return ret;
}
- if (it->options[1]) {
+ /* only ISA interrupts are valid on this board */
+ if (it->options[1] >= 1 && it->options[1] <= 15) {
ret = request_irq(it->options[1], dmm32at_isr, 0,
dev->board_name, dev);
if (ret == 0)
--
2.55.0.windows.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 5/6] comedi: pcmmio: validate the IRQ supplied by userspace
2026-09-09 10:48 [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace Yogesh Gaur
` (3 preceding siblings ...)
2026-09-09 10:48 ` [PATCH 4/6] comedi: dmm32at: " Yogesh Gaur
@ 2026-09-09 10:48 ` Yogesh Gaur
2026-09-09 10:48 ` [PATCH 6/6] comedi: pcmuio: validate the IRQs " Yogesh Gaur
5 siblings, 0 replies; 7+ messages in thread
From: Yogesh Gaur @ 2026-09-09 10:48 UTC (permalink / raw)
To: Ian Abbott, H Hartley Sweeten
Cc: Greg Kroah-Hartman, linux-kernel, Yogesh Gaur
comedi boards are configured through the COMEDI_DEVCONFIG ioctl, so
it->options[1] is a number chosen by userspace. pcmmio passes it to
request_irq() without checking it first, which lets an interrupt owned by
another irqdomain -- a PCI device's IO-APIC GSI, for instance -- be
claimed for this board. When the owner of that interrupt is later
released the descriptor is freed while this driver's handler is still
installed on it.
The board's interrupt is routed in software rather than jumpered, and the
driver notes that "any IRQ from 1-15 is OK", so the ISA range is exactly
the right bound.
Bound the value before requesting it, as das16m1.c already does. An
out-of-range value is ignored rather than rejected, so the board still
attaches without interrupt support, exactly as it does today when
request_irq() fails.
Fixes: 6baef150380d ("Staging: comedi: add pcmmio and pcmuio drivers")
Assisted-by: LLM
Signed-off-by: Yogesh Gaur <yogeshgaur.83@gmail.com>
---
drivers/comedi/drivers/pcmmio.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/comedi/drivers/pcmmio.c b/drivers/comedi/drivers/pcmmio.c
index f42b7343b4e4..afe2bda91659 100644
--- a/drivers/comedi/drivers/pcmmio.c
+++ b/drivers/comedi/drivers/pcmmio.c
@@ -684,7 +684,8 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
pcmmio_reset(dev);
- if (it->options[1]) {
+ /* the irq is configured in software, so any ISA irq is OK */
+ if (it->options[1] >= 1 && it->options[1] <= 15) {
ret = request_irq(it->options[1], interrupt_pcmmio, 0,
dev->board_name, dev);
if (ret == 0) {
--
2.55.0.windows.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 6/6] comedi: pcmuio: validate the IRQs supplied by userspace
2026-09-09 10:48 [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace Yogesh Gaur
` (4 preceding siblings ...)
2026-09-09 10:48 ` [PATCH 5/6] comedi: pcmmio: " Yogesh Gaur
@ 2026-09-09 10:48 ` Yogesh Gaur
5 siblings, 0 replies; 7+ messages in thread
From: Yogesh Gaur @ 2026-09-09 10:48 UTC (permalink / raw)
To: Ian Abbott, H Hartley Sweeten
Cc: Greg Kroah-Hartman, linux-kernel, Yogesh Gaur
comedi boards are configured through the COMEDI_DEVCONFIG ioctl, so
it->options[1] is a number chosen by userspace. pcmuio passes it to
request_irq() without checking it first, which lets an interrupt owned by
another irqdomain -- a PCI device's IO-APIC GSI, for instance -- be
claimed for this board. When the owner of that interrupt is later
released the descriptor is freed while this driver's handler is still
installed on it.
Every interrupt this board can assert is a legacy ISA one, so the ISA
range is the right bound; it is also sufficient, because
mp_chip_data->isa_irq is set only by alloc_isa_irq_from_domain() and
mp_unmap_irq() returns early when it is set.
Bound the value before requesting it, as das16m1.c already does. An
out-of-range value is ignored rather than rejected, so the board still
attaches without interrupt support, exactly as it does today when
request_irq() fails.
This board takes two interrupts, one per ASIC, so options[1] and
options[2] both need the check. The existing options[2] == dev->irq case
is left alone: it covers both ASICs sharing one interrupt and neither
having one, and by then options[1] has already been validated.
Fixes: 6baef150380d ("Staging: comedi: add pcmmio and pcmuio drivers")
Assisted-by: LLM
Signed-off-by: Yogesh Gaur <yogeshgaur.83@gmail.com>
---
drivers/comedi/drivers/pcmuio.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/comedi/drivers/pcmuio.c b/drivers/comedi/drivers/pcmuio.c
index d9995cbeecb6..da80bca0bb55 100644
--- a/drivers/comedi/drivers/pcmuio.c
+++ b/drivers/comedi/drivers/pcmuio.c
@@ -546,7 +546,8 @@ static int pcmuio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
pcmuio_reset(dev);
- if (it->options[1]) {
+ /* only ISA interrupts are valid on this board */
+ if (it->options[1] >= 1 && it->options[1] <= 15) {
/* request the irq for the 1st asic */
ret = request_irq(it->options[1], pcmuio_interrupt, 0,
dev->board_name, dev);
@@ -558,7 +559,7 @@ static int pcmuio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (it->options[2] == dev->irq) {
/* the same irq (or none) is used by both asics */
devpriv->irq2 = it->options[2];
- } else if (it->options[2]) {
+ } else if (it->options[2] >= 1 && it->options[2] <= 15) {
/* request the irq for the 2nd asic */
ret = request_irq(it->options[2], pcmuio_interrupt, 0,
dev->board_name, dev);
--
2.55.0.windows.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-09-09 10:49 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-09 10:48 [PATCH 0/6] comedi: validate the IRQ numbers supplied by userspace Yogesh Gaur
2026-09-09 10:48 ` [PATCH 1/6] comedi: comedi_parport: validate the IRQ " Yogesh Gaur
2026-09-09 10:48 ` [PATCH 2/6] comedi: ni_atmio16d: " Yogesh Gaur
2026-09-09 10:48 ` [PATCH 3/6] comedi: dt2814: " Yogesh Gaur
2026-09-09 10:48 ` [PATCH 4/6] comedi: dmm32at: " Yogesh Gaur
2026-09-09 10:48 ` [PATCH 5/6] comedi: pcmmio: " Yogesh Gaur
2026-09-09 10:48 ` [PATCH 6/6] comedi: pcmuio: validate the IRQs " Yogesh Gaur
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).