forked from Minki/linux
16c4cb19fa
Applying dynamic usbcore quirks in early booting when the slab is
not yet ready would cause kernel panic of null pointer dereference
because the quirk_count has been counted as 1 while the quirk_list
was failed to allocate.
i.e.,
[ 1.044970] BUG: unable to handle kernel NULL pointer dereference at (null)
[ 1.044995] IP: [<ffffffffb0953ec7>] usb_detect_quirks+0x88/0xd1
[ 1.045016] PGD 0
[ 1.045026] Oops: 0000 [#1] PREEMPT SMP
[ 1.046986] gsmi: Log Shutdown Reason 0x03
[ 1.046995] Modules linked in:
[ 1.047008] CPU: 0 PID: 81 Comm: kworker/0:3 Not tainted 4.4.154 #28
[ 1.047016] Hardware name: Google Coral/Coral, BIOS Google_Coral.10068.27.0 12/04/2017
[ 1.047028] Workqueue: usb_hub_wq hub_event
[ 1.047037] task: ffff88017a321c80 task.stack: ffff88017a384000
[ 1.047044] RIP: 0010:[<ffffffffb0953ec7>] [<ffffffffb0953ec7>] usb_detect_quirks+0x88/0xd1
To tackle this odd, let's balance the quirk_count to 0 when the kcalloc
call fails, and defer the quirk setting into a lower level callback
which ensures that the kernel memory management has been initialized.
Fixes:
|
||
---|---|---|
.. | ||
buffer.c | ||
config.c | ||
devices.c | ||
devio.c | ||
driver.c | ||
endpoint.c | ||
file.c | ||
generic.c | ||
hcd-pci.c | ||
hcd.c | ||
hub.c | ||
hub.h | ||
Kconfig | ||
ledtrig-usbport.c | ||
Makefile | ||
message.c | ||
notify.c | ||
of.c | ||
otg_whitelist.h | ||
phy.c | ||
phy.h | ||
port.c | ||
quirks.c | ||
sysfs.c | ||
urb.c | ||
usb-acpi.c | ||
usb.c | ||
usb.h |