linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: James Hughes <james.hughes@raspberrypi.org>
To: Arend Van Spriel <arend.vanspriel@broadcom.com>
Cc: Kalle Valo <kvalo@codeaurora.org>,
	linux-wireless <linux-wireless@vger.kernel.org>
Subject: Re: [PATCH] ath6kl: assure headroom of skbuff is writable in .start_xmit()
Date: Tue, 25 Apr 2017 12:50:51 +0100	[thread overview]
Message-ID: <CAE_XsMKr5YYEgq9_VfzLYUN3HYnmu5+5GNbrzpKHGj4VupMJSg@mail.gmail.com> (raw)
In-Reply-To: <c07932c7-b207-28bc-d540-9a137c66657d@broadcom.com>

On 25 April 2017 at 12:10, Arend Van Spriel
<arend.vanspriel@broadcom.com> wrote:
> On 25-4-2017 11:36, James Hughes wrote:
>> On 25 April 2017 at 10:10, Arend van Spriel
>> <arend.vanspriel@broadcom.com> wrote:
>>> An issue was found brcmfmac driver in which a skbuff in .start_xmit()
>>> callback was actually cloned. So instead of checking for sufficient
>>> headroom it should also be writable. Hence use skb_cow_head() to
>>> check and expand the headroom appropriately.
>>>
>>> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
>>> ---
>>> Hi Kalle,
>>>
>>> Did a recursive grep in drivers/net/wireless and found a similar
>>> case in ath6kl. I do not have the hardware to test so this is
>>> only compile tested.
>>>
>>> Regards,
>>> Arend
>>> ---
>>>  drivers/net/wireless/ath/ath6kl/txrx.c | 13 ++++---------
>>>  1 file changed, 4 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
>>> index a531e0c..e6b2517 100644
>>> --- a/drivers/net/wireless/ath/ath6kl/txrx.c
>>> +++ b/drivers/net/wireless/ath/ath6kl/txrx.c
>>> @@ -399,15 +399,10 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
>>>                         csum_dest = skb->csum_offset + csum_start;
>>>                 }
>>>
>>> -               if (skb_headroom(skb) < dev->needed_headroom) {
>>> -                       struct sk_buff *tmp_skb = skb;
>>> -
>>> -                       skb = skb_realloc_headroom(skb, dev->needed_headroom);
>>> -                       kfree_skb(tmp_skb);
>>> -                       if (skb == NULL) {
>>> -                               dev->stats.tx_dropped++;
>>> -                               return 0;
>>> -                       }
>>> +               if (skb_cow_head(skb, dev->needed_headroom)) {
>>> +                       dev->stats.tx_dropped++;
>>> +                       kfree_skb(skb);
>>> +                       return 0;
>>>                 }
>>>
>>>                 if (ath6kl_wmi_dix_2_dot3(ar->wmi, skb)) {
>>> --
>>> 1.9.1
>>>
>>
>> Not sure if this is the right place to comment on this, but I've had a
>> quick look around various network drivers, and there are similar
>> constructs in a LOT of drivers. I've picked two at random, and both
>> seem to show this issue. When the issue first came up in a USB
>> attached smsc ethernet driver, at least 6 other drivers with similar
>> faults were found in the net/usb tree.  Now I could just be being
>> paranoid, and am missing something, so here are the files I looked
>> at...
>>
>> drivers/net/marvell/mwifiex/uap_txrx.c line 161 - no relevant skb_cow
>> operations in this file, but changes are made to the buffers
>
> This piece of code is used in rx. They have in-driver bridging
> implemented in mwifiex. Surprised to see such a feature in a upstream
> driver.
>
>> /drivers/net/ethernet/sun/niu.c line 6657 - ditto
>
> Looks suspicious indeed.
>
>> I'm a bit of a beginner at this stuff, so not sure how this should be
>> taken forward.
>
> I looked at the wireless drivers specifically and initial grep was for
> skb_push(), but that gave a lot of results. So just did a grep for
> drivers touching struct net_device::needed_headroom. Admittedly that is
> more of a glance than a proper look and it would probably be best if
> driver maintainers would check for such headroom constructs in their
> driver(s).
>
> Regards,
> Arend

I only checked those two so I suspect more will be in there. There is
also a lot of boilerplate code that could be removed simply by using
skb_cow_header...is there a standard way of telling all maintainers to
check their drivers for particular issues?

I did a grep for skb_headroom since it seems unlikely that would be
required except in circumstances like this, to find an initial list of
possibilities but don't have time to check all the hits!

  reply	other threads:[~2017-04-25 11:50 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-25  9:10 [PATCH] ath6kl: assure headroom of skbuff is writable in .start_xmit() Arend van Spriel
2017-04-25  9:36 ` James Hughes
2017-04-25 11:10   ` Arend Van Spriel
2017-04-25 11:50     ` James Hughes [this message]
2017-04-26  8:53 ` Kalle Valo
2017-04-26 15:44   ` Steve deRosier
2017-04-26 18:03     ` Arend Van Spriel
2017-04-26 19:54       ` James Hughes
2017-04-27  4:55         ` Steve deRosier
2017-04-27  8:54           ` James Hughes
2017-05-04 13:08           ` Kalle Valo
     [not found] ` <20170426085337.293296148E@smtp.codeaurora.org>
2017-04-26  9:00   ` Arend van Spriel
2017-05-19  7:48 ` Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAE_XsMKr5YYEgq9_VfzLYUN3HYnmu5+5GNbrzpKHGj4VupMJSg@mail.gmail.com \
    --to=james.hughes@raspberrypi.org \
    --cc=arend.vanspriel@broadcom.com \
    --cc=kvalo@codeaurora.org \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).