All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Pirko <jiri@resnulli.us>
To: Hangbin Liu <liuhangbin@gmail.com>
Cc: Ziyang Xuan <william.xuanziyang@huawei.com>,
	davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
	pabeni@redhat.com, netdev@vger.kernel.org
Subject: Re: [PATCH net] team: fix null-ptr-deref when team device type is changed
Date: Mon, 4 Sep 2023 13:00:08 +0200	[thread overview]
Message-ID: <ZPW4uC6XkMXl0O2O@nanopsycho> (raw)
In-Reply-To: <ZPWwE9IYArI08Zsc@Laptop-X1>

Mon, Sep 04, 2023 at 12:23:15PM CEST, liuhangbin@gmail.com wrote:
>Hi Ziyang,
>
>On Sat, Sep 02, 2023 at 05:20:07PM +0800, Ziyang Xuan wrote:
>> $ teamd -t team0 -d -c '{"runner": {"name": "loadbalance"}}'
>> $ ip link add name t-dummy type dummy
>> $ ip link add link t-dummy name t-dummy.100 type vlan id 100
>> $ ip link add name t-nlmon type nlmon
>> $ ip link set t-nlmon master team0
>> $ ip link set t-nlmon nomaster
>> $ ip link set t-dummy up
>> $ ip link set team0 up
>> $ ip link set t-dummy.100 down
>> $ ip link set t-dummy.100 master team0
>> 
>> When enslave a vlan device to team device and team device type is changed
>> from non-ether to ether, header_ops of team device is changed to
>> vlan_header_ops. That is incorrect and will trigger null-ptr-deref
>> for vlan->real_dev in vlan_dev_hard_header() because team device is not
>> a vlan device.
>> 
>> Use ether_setup() for team device when its type is changed from non-ether
>> to ether to fix the bug.
>> 
>> Fixes: 1d76efe1577b ("team: add support for non-ethernet devices")
>> Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
>> ---
>>  drivers/net/team/team.c | 21 +++++++++++++--------
>>  1 file changed, 13 insertions(+), 8 deletions(-)
>> 
>> diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
>> index d3dc22509ea5..560e04860aa7 100644
>> --- a/drivers/net/team/team.c
>> +++ b/drivers/net/team/team.c
>> @@ -2127,14 +2127,19 @@ static const struct ethtool_ops team_ethtool_ops = {
>>  static void team_setup_by_port(struct net_device *dev,
>>  			       struct net_device *port_dev)
>>  {
>> -	dev->header_ops	= port_dev->header_ops;
>> -	dev->type = port_dev->type;
>> -	dev->hard_header_len = port_dev->hard_header_len;
>> -	dev->needed_headroom = port_dev->needed_headroom;
>> -	dev->addr_len = port_dev->addr_len;
>> -	dev->mtu = port_dev->mtu;
>> -	memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len);
>> -	eth_hw_addr_inherit(dev, port_dev);
>> +	if (port_dev->type == ARPHRD_ETHER) {
>> +		ether_setup(dev);
>> +		eth_hw_addr_random(dev);
>> +	} else {
>> +		dev->header_ops	= port_dev->header_ops;
>> +		dev->type = port_dev->type;
>> +		dev->hard_header_len = port_dev->hard_header_len;
>> +		dev->needed_headroom = port_dev->needed_headroom;
>> +		dev->addr_len = port_dev->addr_len;
>> +		dev->mtu = port_dev->mtu;
>> +		memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len);
>> +		eth_hw_addr_inherit(dev, port_dev);
>> +	}
>>  
>>  	if (port_dev->flags & IFF_POINTOPOINT) {
>>  		dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);
>
>Thanks for the report. This fix is similar with what I do in my PATCHv3 [1].
>And this will go back to the discussion of MTU update. How about just update
>the header_ops for ARPHRD_ETHER? e.g.
>
>	if (port_dev->type == ARPHRD_ETHER)
>		dev->header_ops	= &eth_header_ops;
>	else
>		dev->header_ops	= port_dev->header_ops;

Yes, this sounds better.


>
>[1] https://lore.kernel.org/netdev/20230718101741.2751799-3-liuhangbin@gmail.com/
>
>Thanks
>Hangbin

  reply	other threads:[~2023-09-04 11:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-02  9:20 [PATCH net] team: fix null-ptr-deref when team device type is changed Ziyang Xuan
2023-09-04 10:23 ` Hangbin Liu
2023-09-04 11:00   ` Jiri Pirko [this message]
2023-09-05  3:36   ` Ziyang Xuan (William)

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=ZPW4uC6XkMXl0O2O@nanopsycho \
    --to=jiri@resnulli.us \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=liuhangbin@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=william.xuanziyang@huawei.com \
    /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 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.