diff mbox

bgmac: fix a missing check for build_skb

Message ID 5695BF41.2040002@huawei.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

wangweidong Jan. 13, 2016, 3:06 a.m. UTC
when build_skb failed, it may occure a NULL pointer.
So add a 'NULL check' for it.

Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
---
 drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

David Miller Jan. 13, 2016, 5:24 a.m. UTC | #1
From: Weidong Wang <wangweidong1@huawei.com>
Date: Wed, 13 Jan 2016 11:06:41 +0800

> when build_skb failed, it may occure a NULL pointer.
> So add a 'NULL check' for it.
> 
> Signed-off-by: Weidong Wang <wangweidong1@huawei.com>

Applied, thanks.
Paolo Abeni Jan. 13, 2016, 8:34 a.m. UTC | #2
On Wed, 2016-01-13 at 11:06 +0800, Weidong Wang wrote:
> when build_skb failed, it may occure a NULL pointer.
> So add a 'NULL check' for it.
> 
> Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
> ---
>  drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
> index 21e3c38..d75180a 100644
> --- a/drivers/net/ethernet/broadcom/bgmac.c
> +++ b/drivers/net/ethernet/broadcom/bgmac.c
> @@ -466,6 +466,11 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
>  			len -= ETH_FCS_LEN;
> 
>  			skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
> +			if (unlikely(skb)) {

Should that be instead:

if (unlikely(!skb)) {

?

> +				bgmac_err(bgmac, "build_skb failed\n");
> +				put_page(virt_to_head_page(buf));
> +				break;
> +			}
>  			skb_put(skb, BGMAC_RX_FRAME_OFFSET +
>  				BGMAC_RX_BUF_OFFSET + len);
>  			skb_pull(skb, BGMAC_RX_FRAME_OFFSET +
wangweidong Jan. 13, 2016, 10:25 a.m. UTC | #3
On 2016/1/13 16:34, Paolo Abeni wrote:
> On Wed, 2016-01-13 at 11:06 +0800, Weidong Wang wrote:
>> when build_skb failed, it may occure a NULL pointer.
>> So add a 'NULL check' for it.
>>
>> Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
>> ---
>>  drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
>> index 21e3c38..d75180a 100644
>> --- a/drivers/net/ethernet/broadcom/bgmac.c
>> +++ b/drivers/net/ethernet/broadcom/bgmac.c
>> @@ -466,6 +466,11 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
>>  			len -= ETH_FCS_LEN;
>>
>>  			skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
>> +			if (unlikely(skb)) {
> 
> Should that be instead:
> 
> if (unlikely(!skb)) {
> 
> ?
> 

What to instead of it?

Regards,
Weidong

>> +				bgmac_err(bgmac, "build_skb failed\n");
>> +				put_page(virt_to_head_page(buf));
>> +				break;
>> +			}
>>  			skb_put(skb, BGMAC_RX_FRAME_OFFSET +
>>  				BGMAC_RX_BUF_OFFSET + len);
>>  			skb_pull(skb, BGMAC_RX_FRAME_OFFSET +
> 
> 
> .
>
Felix Fietkau Jan. 13, 2016, 10:57 a.m. UTC | #4
On 2016-01-13 11:25, Weidong Wang wrote:
> On 2016/1/13 16:34, Paolo Abeni wrote:
>> On Wed, 2016-01-13 at 11:06 +0800, Weidong Wang wrote:
>>> when build_skb failed, it may occure a NULL pointer.
>>> So add a 'NULL check' for it.
>>>
>>> Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
>>> ---
>>>  drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
>>>  1 file changed, 5 insertions(+)
>>>
>>> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
>>> index 21e3c38..d75180a 100644
>>> --- a/drivers/net/ethernet/broadcom/bgmac.c
>>> +++ b/drivers/net/ethernet/broadcom/bgmac.c
>>> @@ -466,6 +466,11 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
>>>  			len -= ETH_FCS_LEN;
>>>
>>>  			skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
>>> +			if (unlikely(skb)) {
>> 
>> Should that be instead:
>> 
>> if (unlikely(!skb)) {
>> 
>> ?
>> 
> 
> What to instead of it?
Your patch has a logic error (missing the !), and it's breaking the
ethernet driver completely instead of fixing anything.
Did you even test this?

Dave, why did you apply this patch so fast without any chance of review?

- Felix
wangweidong Jan. 13, 2016, 11:31 a.m. UTC | #5
On 2016/1/13 18:57, Felix Fietkau wrote:
> On 2016-01-13 11:25, Weidong Wang wrote:
>> On 2016/1/13 16:34, Paolo Abeni wrote:
>>> On Wed, 2016-01-13 at 11:06 +0800, Weidong Wang wrote:
>>>> when build_skb failed, it may occure a NULL pointer.
>>>> So add a 'NULL check' for it.
>>>>
>>>> Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
>>>> ---
>>>>  drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
>>>>  1 file changed, 5 insertions(+)
>>>>
>>>> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
>>>> index 21e3c38..d75180a 100644
>>>> --- a/drivers/net/ethernet/broadcom/bgmac.c
>>>> +++ b/drivers/net/ethernet/broadcom/bgmac.c
>>>> @@ -466,6 +466,11 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
>>>>  			len -= ETH_FCS_LEN;
>>>>
>>>>  			skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
>>>> +			if (unlikely(skb)) {
>>>
>>> Should that be instead:
>>>
>>> if (unlikely(!skb)) {
>>>
>>> ?
>>>
>>
>> What to instead of it?
> Your patch has a logic error (missing the !), and it's breaking the
> ethernet driver completely instead of fixing anything.
> Did you even test this?
> 

Yep, you are right.
Sorry for that.
I just review the source code without any test.
I should resent it again.

> Dave, why did you apply this patch so fast without any chance of review?
> 
> - Felix
> 
> .
> 

Regards,
Weidong
Sergei Shtylyov Jan. 13, 2016, 12:10 p.m. UTC | #6
Hello.

On 1/13/2016 6:06 AM, Weidong Wang wrote:

> when build_skb failed, it may occure a NULL pointer.
> So add a 'NULL check' for it.
>
> Signed-off-by: Weidong Wang <wangweidong1@huawei.com>
> ---
>   drivers/net/ethernet/broadcom/bgmac.c | 5 +++++
>   1 file changed, 5 insertions(+)
>
> diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
> index 21e3c38..d75180a 100644
> --- a/drivers/net/ethernet/broadcom/bgmac.c
> +++ b/drivers/net/ethernet/broadcom/bgmac.c
> @@ -466,6 +466,11 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
>   			len -= ETH_FCS_LEN;
>
>   			skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
> +			if (unlikely(skb)) {

    !skb , you mean?

> +				bgmac_err(bgmac, "build_skb failed\n");
> +				put_page(virt_to_head_page(buf));
> +				break;
> +			}
>   			skb_put(skb, BGMAC_RX_FRAME_OFFSET +
>   				BGMAC_RX_BUF_OFFSET + len);
>   			skb_pull(skb, BGMAC_RX_FRAME_OFFSET +

MBR, Sergei
David Miller Jan. 13, 2016, 3:34 p.m. UTC | #7
From: Felix Fietkau <nbd@openwrt.org>
Date: Wed, 13 Jan 2016 11:57:51 +0100

> Dave, why did you apply this patch so fast without any chance of
> review?

Because I wanted to clear my backlog %100 for the merge window
initial pull request.

The patch looked simple enough, I did read it carefully, and I
did unfortunately miss the logic error.
diff mbox

Patch

diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
index 21e3c38..d75180a 100644
--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -466,6 +466,11 @@  static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
 			len -= ETH_FCS_LEN;

 			skb = build_skb(buf, BGMAC_RX_ALLOC_SIZE);
+			if (unlikely(skb)) {
+				bgmac_err(bgmac, "build_skb failed\n");
+				put_page(virt_to_head_page(buf));
+				break;
+			}
 			skb_put(skb, BGMAC_RX_FRAME_OFFSET +
 				BGMAC_RX_BUF_OFFSET + len);
 			skb_pull(skb, BGMAC_RX_FRAME_OFFSET +