mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
usb: gadget: goku_udc: avoid NULL deref of dev->driver in INT_USBRESET log
goku_irq() handles a number of bus events under a single ep0 path.
It already guards the gadget driver suspend/resume callbacks against a
NULL ->driver:
if (dev->gadget.speed != USB_SPEED_UNKNOWN
&& dev->driver
&& dev->driver->resume) {
spin_unlock(&dev->lock);
dev->driver->resume(&dev->gadget);
...
}
but the very next branch unconditionally dereferences dev->driver
when an INT_USBRESET arrives:
if (stat & INT_USBRESET) {
ACK(INT_USBRESET);
INFO(dev, "USB reset done, gadget %s\n",
dev->driver->driver.name);
}
If the controller raises INT_USBRESET before any gadget driver has
been bound (or after one has been unbound), dev->driver is NULL and
the printk dereferences NULL.
smatch flags the inconsistency:
drivers/usb/gadget/udc/goku_udc.c:1618 goku_irq() error:
we previously assumed 'dev->driver' could be null (see line 1607)
Fall back to a placeholder when the gadget driver is not bound.
No functional change while a gadget driver is bound.
Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com>
Link: https://patch.msgid.link/20260509110636.19762-1-sozdayvek@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c708d07ce7
commit
5bf5e3fba9
|
|
@ -1616,7 +1616,8 @@ static irqreturn_t goku_irq(int irq, void *_dev)
|
|||
if (stat & INT_USBRESET) { /* hub reset done */
|
||||
ACK(INT_USBRESET);
|
||||
INFO(dev, "USB reset done, gadget %s\n",
|
||||
dev->driver->driver.name);
|
||||
dev->driver ? dev->driver->driver.name :
|
||||
"<not bound>");
|
||||
}
|
||||
// and INT_ERR on some endpoint's crc/bitstuff/... problem
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user