[U-Boot] [PATCH v2] usb: xhci: Fix a potential NULL pointer dereference
Sergei Temerkhanov
s.temerkhanov at gmail.com
Sat Aug 15 00:28:10 CEST 2015
On Fri, Aug 14, 2015 at 11:46 PM, Marek Vasut <marex at denx.de> wrote:
> On Friday, August 14, 2015 at 05:14:09 PM, Sergey Temerkhanov wrote:
>> This patch fixes a potential NULL pointer dereference arising on
>> non-present/non-initialized xHCI controllers and adds some error
>> handling to xHCI code
>>
>> Signed-off-by: Sergey Temerkhanov <s.temerkhanov at gmail.com>
>> Signed-off-by: Radha Mohan Chintakuntla <rchintakuntla at cavium.com>
>>
>> ---
>>
>> Changes in v2:
>> - Add return value check with setting hccr and hcor to NULL
>>
>> drivers/usb/host/xhci.c | 15 +++++++++++----
>> 1 file changed, 11 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
>> index 0b09643..f8e2d70 100644
>> --- a/drivers/usb/host/xhci.c
>> +++ b/drivers/usb/host/xhci.c
>> @@ -199,7 +199,7 @@ int xhci_reset(struct xhci_hcor *hcor)
>> int ret;
>>
>> /* Halting the Host first */
>> - debug("// Halt the HC\n");
>> + debug("// Halt the HC: %p\n", hcor);
>> state = xhci_readl(&hcor->or_usbsts) & STS_HALT;
>> if (!state) {
>> cmd = xhci_readl(&hcor->or_usbcmd);
>> @@ -1079,6 +1079,11 @@ int usb_lowlevel_init(int index, enum usb_init_type
>> init, void **controller)
>>
>> *controller = &xhcic[index];
>>
>> + if (ret) {
>> + ctrl->hccr = NULL;
>> + ctrl->hcor = NULL;
>
> Controller should be set to NULL too, for the sake of being completely precise,
> don't you think so ?
Maybe. Though the only place it's actually used at the moment (there
is also some USB gadget stuff
which seems to rely on EHCI) passes a pointer to a local variable and
checks the return value.
>
>> + }
>> +
>> return ret;
>> }
>>
>> @@ -1093,9 +1098,11 @@ int usb_lowlevel_stop(int index)
>> {
>> struct xhci_ctrl *ctrl = (xhcic + index);
>>
>> - xhci_lowlevel_stop(ctrl);
>> - xhci_hcd_stop(index);
>> - xhci_cleanup(ctrl);
>> + if (ctrl->hcor) {
>> + xhci_lowlevel_stop(ctrl);
>> + xhci_hcd_stop(index);
>> + xhci_cleanup(ctrl);
>> + }
>>
>> return 0;
>> }
>
> Good job, thanks :)
>
> Best regards,
> Marek Vasut
More information about the U-Boot
mailing list