* [usb-gadget-udc] question about null check after calling phys_to_virt() function
@ 2017-05-02 20:24 Gustavo A. R. Silva
2017-05-16 8:10 ` Felipe Balbi
0 siblings, 1 reply; 3+ messages in thread
From: Gustavo A. R. Silva @ 2017-05-02 20:24 UTC (permalink / raw)
To: Felipe Balbi, Greg Kroah-Hartman, Michal Nazarewicz
Cc: linux-geode, linux-usb, linux-kernel, Peter Senna Tschudin
Hello everybody,
While looking into Coverity ID 145958 I ran into the following piece
of code at drivers/usb/gadget/udc/amd5536udc.c:852:
} else if (i == buf_len) {
/* first td */
td = (struct udc_data_dma *)phys_to_virt(
req->td_data->next);
td->status = 0;
} else {
td = (struct udc_data_dma *)phys_to_virt(last->next);
td->status = 0;
}
if (td)
td->bufptr = req->req.dma + i; /* assign buffer */
else
break;
The issue here is that _td_ pointer is being dereferenced before null check.
After searching for calls to phys_to_virt() function, I've noticed
that is not common at all to test the returned address value.
So either the null check at line 862 is not needed or a null check
before each td->status = 0; needs to be added.
I think it would be good to apply a patch like the following one:
- td->status = 0;
+
+ if (td)
+ td->status = 0;
+ else
+ break;
} else {
td = (struct udc_data_dma *)phys_to_virt(last->next);
- td->status = 0;
+
+ if (td)
+ td->status = 0;
+ else
+ break;
}
- if (td)
- td->bufptr = req->req.dma + i; /* assign buffer */
- else
- break;
+ td->bufptr = req->req.dma + i; /* assign buffer */
What do you think?
Thanks in advance for your comments
--
Gustavo A. R. Silva
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [usb-gadget-udc] question about null check after calling phys_to_virt() function
2017-05-02 20:24 [usb-gadget-udc] question about null check after calling phys_to_virt() function Gustavo A. R. Silva
@ 2017-05-16 8:10 ` Felipe Balbi
2017-05-16 16:28 ` Gustavo A. R. Silva
0 siblings, 1 reply; 3+ messages in thread
From: Felipe Balbi @ 2017-05-16 8:10 UTC (permalink / raw)
To: Gustavo A. R. Silva, Greg Kroah-Hartman, Michal Nazarewicz
Cc: linux-geode, linux-usb, linux-kernel, Peter Senna Tschudin
[-- Attachment #1: Type: text/plain, Size: 1033 bytes --]
Hi,
"Gustavo A. R. Silva" <garsilva@embeddedor.com> writes:
> Hello everybody,
>
> While looking into Coverity ID 145958 I ran into the following piece
> of code at drivers/usb/gadget/udc/amd5536udc.c:852:
>
> } else if (i == buf_len) {
> /* first td */
> td = (struct udc_data_dma *)phys_to_virt(
> req->td_data->next);
> td->status = 0;
> } else {
> td = (struct udc_data_dma *)phys_to_virt(last->next);
> td->status = 0;
> }
>
> if (td)
> td->bufptr = req->req.dma + i; /* assign buffer */
> else
> break;
>
> The issue here is that _td_ pointer is being dereferenced before null check.
>
> After searching for calls to phys_to_virt() function, I've noticed
> that is not common at all to test the returned address value.
>
> So either the null check at line 862 is not needed or a null check
> before each td->status = 0; needs to be added.
just remove the previous null check
--
balbi
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [usb-gadget-udc] question about null check after calling phys_to_virt() function
2017-05-16 8:10 ` Felipe Balbi
@ 2017-05-16 16:28 ` Gustavo A. R. Silva
0 siblings, 0 replies; 3+ messages in thread
From: Gustavo A. R. Silva @ 2017-05-16 16:28 UTC (permalink / raw)
To: Felipe Balbi
Cc: Greg Kroah-Hartman, Michal Nazarewicz, linux-geode, linux-usb,
linux-kernel, Peter Senna Tschudin
Hi Felipe,
Quoting Felipe Balbi <balbi@kernel.org>:
> Hi,
>
> "Gustavo A. R. Silva" <garsilva@embeddedor.com> writes:
>> Hello everybody,
>>
>> While looking into Coverity ID 145958 I ran into the following piece
>> of code at drivers/usb/gadget/udc/amd5536udc.c:852:
>>
>> } else if (i == buf_len) {
>> /* first td */
>> td = (struct udc_data_dma *)phys_to_virt(
>> req->td_data->next);
>> td->status = 0;
>> } else {
>> td = (struct udc_data_dma *)phys_to_virt(last->next);
>> td->status = 0;
>> }
>>
>> if (td)
>> td->bufptr = req->req.dma + i; /* assign buffer */
>> else
>> break;
>>
>> The issue here is that _td_ pointer is being dereferenced before null check.
>>
>> After searching for calls to phys_to_virt() function, I've noticed
>> that is not common at all to test the returned address value.
>>
>> So either the null check at line 862 is not needed or a null check
>> before each td->status = 0; needs to be added.
>
> just remove the previous null check
>
I get it.
Thanks!
--
Gustavo A. R. Silva
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-05-16 16:29 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-02 20:24 [usb-gadget-udc] question about null check after calling phys_to_virt() function Gustavo A. R. Silva
2017-05-16 8:10 ` Felipe Balbi
2017-05-16 16:28 ` Gustavo A. R. Silva
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.