> > On Thu, Jul 16, 2015 at 04:04:28PM +0800, Peter Chen wrote: > > At some unexpected cases, the host may send the non-core control > > request before the configruation has been established, so the > > cdev->config is still NULL, then below NULL pointer dereference issue > > problem will occur. Although the udc driver can handle non-core > > control request beforhand, we still need composite core can handle some > exceptions and without system crash. > > > > I meet this issue when I connect one board which supports USB OTG 2.0 > > (SRP & HNP), this board uses an internal bsp code, and another > > B-device uses the latest upstream mode which supports USB OTG not very > > well, so when the host sends the SET_FEATURE for > > USB_DEVICE_A_HNP_SUPPORT request (non-core control req00.03 v0004 > > i0000 l0), the udc driver does not handle it, and the composite driver > > takes it as a unknown request, it tries to get functions within configuration > before checking configuration's valid. > > > > root@imx6sxsabresd:~# modprobe g_mass_storage file=/dev/mmcblk0p1 > removable=1 > > [ 41.994328] Number of LUNs=8 > > [ 41.997260] Mass Storage Function, version: 2009/09/11 > > [ 42.004301] LUN: removable file: (no medium) > > [ 42.012441] Number of LUNs=1 > > [ 42.016179] LUN: removable file: /dev/mmcblk0p1 > > [ 42.020855] Number of LUNs=1 > > [ 42.028315] g_mass_storage gadget: Mass Storage Gadget, version: > 2009/09/11 > > [ 42.035395] g_mass_storage gadget: userspace failed to provide > iSerialNumber > > [ 42.042559] g_mass_storage gadget: g_mass_storage ready > > root@imx6sxsabresd:~# > > root@imx6sxsabresd:~# [ 43.735411] Unable to handle kernel NULL pointer > dereference at virtual address 00000028 > > [ 43.743523] pgd = 80004000 > > [ 43.746237] [00000028] *pgd=00000000 > > [ 43.749840] Internal error: Oops: 17 [#1] SMP ARM > > [ 43.754551] Modules linked in: g_mass_storage usb_f_mass_storage > libcomposite configfs evbug > > [ 43.763096] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.2.0-rc1-00007- > ga577f1b-dirty #358 > > [ 43.771278] Hardware name: Freescale i.MX6 SoloX (Device Tree) > > [ 43.777118] task: 80c9a9f8 ti: 80c94000 task.ti: 80c94000 > > [ 43.782558] PC is at composite_setup+0xe4/0x18d4 [libcomposite] > > [ 43.788484] LR is at 0x1 > > [ 43.791025] pc : [<7f0120e4>] lr : [<00000001>] psr: 600b0193 > > [ 43.791025] sp : 80c95d30 ip : 00000000 fp : 80c95d94 > > [ 43.802507] r10: 80c95dc8 r9 : 00000004 r8 : 00000000 > > [ 43.807738] r7 : 00000000 r6 : bd0c82d0 r5 : bd3fdb00 r4 : bd3fd080 > > [ 43.814269] r3 : 00000000 r2 : 00000000 r1 : 00000000 r0 : 00000003 > > [ 43.820803] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment > kernel > > [ 43.828205] Control: 10c5387d Table: bbc0c04a DAC: 00000015 > > [ 43.833958] Process swapper/0 (pid: 0, stack limit = 0x80c94210) > > [ 43.839970] Stack: (0x80c95d30 to 0x80c96000) > > [ 43.844336] 5d20: 808bc300 8007bf24 00000001 00000000 > > [ 43.852523] 5d40: 8056b280 80c95d50 00000000 600b0193 80c95d94 bd0c8014 > bd0c8010 00000000 > > [ 43.860710] 5d60: 00082001 808bc5c8 600b0193 bd0c8014 bd0c8010 00080001 > 00082001 bd0c8568 > > [ 43.868896] 5d80: bd0c9010 c0876140 80c95dfc 80c95d98 8056c0ec 7f01200c > bd0c8568 bd0c8014 > > [ 43.877083] 5da0: 00000001 00000000 bd0c9010 00000000 800787b8 bd0c8010 > 00000000 80075e2c > > [ 43.885270] 5dc0: 00000001 00000080 00040300 00000000 80c95dfc bd0c8010 > 0b242f20 bd0c9010 > > [ 43.893456] 5de0: 00000000 00000000 80d42428 80d4243c 80c95e1c 80c95e00 > 805684e4 8056b8ec > > [ 43.901643] 5e00: 8056847c bd064bc0 be1cf264 00000116 80c95e5c 80c95e20 > 800849ec 80568488 > > [ 43.909829] 5e20: be1cf264 bd064bc0 be1cf200 00000000 600b0193 be1cf200 > be1cf264 bd064bc0 > > [ 43.918015] 5e40: 00000000 00000001 be01e000 808c0640 80c95e7c 80c95e60 > 80084bec 800849a4 > > [ 43.926202] 5e60: 00000000 be1cf200 be1cf264 80ca3798 80c95e9c 80c95e80 > 800881a0 80084ba8 > > [ 43.934389] 5e80: 800880c4 00000116 00000116 80c972d4 80c95eb4 80c95ea0 > 80083f4c 800880d0 > > [ 43.942576] 5ea0: 00000125 80c90654 80c95edc 80c95eb8 800842a4 80083f20 > 80c95f00 c080e10c > > [ 43.950762] 5ec0: 80c974bc c080e100 80c969c4 80c60278 80c95efc 80c95ee0 > 800095a8 8008423c > > [ 43.958949] 5ee0: 800115d4 200b0013 ffffffff 80c95f34 80c95f54 80c95f00 > 80015be4 80009584 > > [ 43.967135] 5f00: 00000001 00000001 00000000 80025fc0 80c94000 80c96a10 > 00000001 80d429c8 > > [ 43.975322] 5f20: 80c969c4 80c60278 808c0640 80c95f54 80c95f18 80c95f48 > 80075a14 800115d4 > > [ 43.983509] 5f40: 200b0013 ffffffff 80c95f64 80c95f58 8007010c 800115b0 > 80c95f84 80c95f68 > > [ 43.991696] 5f60: 80070264 800700e8 80c95f84 80c8e3e4 808b7854 80c96900 > 80c95fac 80c95f88 > > [ 43.999883] 5f80: 808ac968 80070128 00000000 00000000 808ac834 ffffffff > 80d5c050 80d5c000 > > [ 44.008070] 5fa0: 80c95ff4 80c95fb0 80be5cd0 808ac840 ffffffff ffffffff > 00000000 80be56ec > > [ 44.016255] 5fc0: 00000000 80c60278 00000000 80d5c294 80c969ac 80c60274 > 80c9c420 8000406a > > [ 44.024441] 5fe0: 412fc09a 00000000 00000000 80c95ff8 8000807c 80be596c > 00000000 00000000 > > [ 44.032621] Backtrace: > > [ 44.035122] [<7f012000>] (composite_setup [libcomposite]) from > [<8056c0ec>] (udc_irq+0x80c/0xe68) > > [ 44.044000] r10:c0876140 r9:bd0c9010 r8:bd0c8568 r7:00082001 r6:00080001 > r5:bd0c8010 > > [ 44.051916] r4:bd0c8014 > > [ 44.054483] [<8056b8e0>] (udc_irq) from [<805684e4>] (ci_irq+0x68/0x160) > > [ 44.061189] r10:80d4243c r9:80d42428 r8:00000000 r7:00000000 r6:bd0c9010 > r5:0b242f20 > > [ 44.069106] r4:bd0c8010 > > [ 44.071672] [<8056847c>] (ci_irq) from [<800849ec>] > (handle_irq_event_percpu+0x54/0x204) > > [ 44.079765] r6:00000116 r5:be1cf264 r4:bd064bc0 r3:8056847c > > [ 44.085500] [<80084998>] (handle_irq_event_percpu) from [<80084bec>] > (handle_irq_event+0x50/0x74) > > [ 44.094376] r10:808c0640 r9:be01e000 r8:00000001 r7:00000000 r6:bd064bc0 > r5:be1cf264 > > [ 44.102291] r4:be1cf200 > > [ 44.104854] [<80084b9c>] (handle_irq_event) from [<800881a0>] > (handle_fasteoi_irq+0xdc/0x1c4) > > [ 44.113383] r6:80ca3798 r5:be1cf264 r4:be1cf200 r3:00000000 > > [ 44.119117] [<800880c4>] (handle_fasteoi_irq) from [<80083f4c>] > (generic_handle_irq+0x38/0x4c) > > [ 44.127732] r6:80c972d4 r5:00000116 r4:00000116 r3:800880c4 > > [ 44.133465] [<80083f14>] (generic_handle_irq) from [<800842a4>] > (__handle_domain_irq+0x74/0xf0) > > [ 44.142167] r4:80c90654 r3:00000125 > > [ 44.145788] [<80084230>] (__handle_domain_irq) from [<800095a8>] > (gic_handle_irq+0x30/0x70) > > [ 44.154142] r9:80c60278 r8:80c969c4 r7:c080e100 r6:80c974bc r5:c080e10c > r4:80c95f00 > > [ 44.161977] [<80009578>] (gic_handle_irq) from [<80015be4>] > (__irq_svc+0x44/0x5c) > > [ 44.169465] Exception stack(0x80c95f00 to 0x80c95f48) > > [ 44.174527] 5f00: 00000001 00000001 00000000 80025fc0 80c94000 80c96a10 > 00000001 80d429c8 > > [ 44.182714] 5f20: 80c969c4 80c60278 808c0640 80c95f54 80c95f18 80c95f48 > 80075a14 800115d4 > > [ 44.190895] 5f40: 200b0013 ffffffff > > [ 44.194388] r7:80c95f34 r6:ffffffff r5:200b0013 r4:800115d4 > > [ 44.200137] [<800115a4>] (arch_cpu_idle) from [<8007010c>] > (default_idle_call+0x30/0x40) > > [ 44.208243] [<800700dc>] (default_idle_call) from [<80070264>] > (cpu_startup_entry+0x148/0x270) > > [ 44.216869] [<8007011c>] (cpu_startup_entry) from [<808ac968>] > (rest_init+0x134/0x170) > > [ 44.224790] r7:80c96900 > > [ 44.227354] [<808ac834>] (rest_init) from [<80be5cd0>] > (start_kernel+0x370/0x3e8) > > [ 44.234842] r5:80d5c000 r4:80d5c050 > > [ 44.238458] [<80be5960>] (start_kernel) from [<8000807c>] (0x8000807c) > > [ 44.244995] Code: e3130001 1a000039 e594200c e1a03002 (e5b35028) > > [ 44.251100] ---[ end trace 48ab8610ac76d0a2 ]--- > > [ 44.255725] Kernel panic - not syncing: Fatal exception in interrupt > > [ 44.262092] ---[ end Kernel panic - not syncing: Fatal exception in interrupt > > > > Cc: <stable@xxxxxxxxxxxxxxx> #v3.14+ > > Cc: Jun Li <jun.li@xxxxxxxxxxxxx> > > Cc: Roger Quadros <rogerq@xxxxxx> > > Signed-off-by: Peter Chen <peter.chen@xxxxxxxxxxxxx> > > --- > > drivers/usb/gadget/composite.c | 2 ++ > > 1 file changed, 2 insertions(+) > > > > diff --git a/drivers/usb/gadget/composite.c > > b/drivers/usb/gadget/composite.c index 4e3447b..dc836b3 100644 > > --- a/drivers/usb/gadget/composite.c > > +++ b/drivers/usb/gadget/composite.c > > @@ -1758,6 +1758,8 @@ unknown: > > * take such requests too, if that's ever needed: to work > > * in config 0, etc. > > */ > > + if (!cdev->config) > > + break; > > list_for_each_entry(f, &cdev->config->functions, list) > > if (f->req_match && f->req_match(f, ctrl)) > > goto try_fun_setup; > > -- > > 1.9.1 > > > > For this case, could be better if fix it like A_ALT_HNP_SUPPORT > in chipidea/udc.c? Like I mentioned at commit log, changing udc driver can fix this specific case, but composite core should handle any unexpected requests well, without any crashes. Peter -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html