From: David Ahern <dsahern@gmail.com>
To: Ido Schimmel <idosch@idosch.org>,
Nikolay Aleksandrov <razor@blackwall.org>
Cc: netdev@vger.kernel.org, davem@davemloft.net, kuba@kernel.org,
Nikolay Aleksandrov <nikolay@nvidia.com>
Subject: Re: [RFC PATCH net] net: ipv6: make fib6_nh_init properly clean after itself on error
Date: Tue, 30 Nov 2021 09:01:31 -0700 [thread overview]
Message-ID: <0243bb47-4b5f-a1d7-ff63-adcb6504df8a@gmail.com> (raw)
In-Reply-To: <YaYbusXHbVQUXpmB@shredder>
On 11/30/21 5:40 AM, Ido Schimmel wrote:
> On Mon, Nov 29, 2021 at 04:11:51PM +0200, Nikolay Aleksandrov wrote:
>> diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c
>> index 5dbd4b5505eb..a7debafe8b90 100644
>> --- a/net/ipv4/nexthop.c
>> +++ b/net/ipv4/nexthop.c
>> @@ -2565,14 +2565,8 @@ static int nh_create_ipv6(struct net *net, struct nexthop *nh,
>> /* sets nh_dev if successful */
>> err = ipv6_stub->fib6_nh_init(net, fib6_nh, &fib6_cfg, GFP_KERNEL,
>> extack);
>> - if (err) {
>> - /* IPv6 is not enabled, don't call fib6_nh_release */
>> - if (err == -EAFNOSUPPORT)
>> - goto out;
>> - ipv6_stub->fib6_nh_release(fib6_nh);
>> - } else {
>> + if (!err)
>> nh->nh_flags = fib6_nh->fib_nh_flags;
>> - }
>> out:
>> return err;
>> }
>
> This hunk looks good
agreed, but it should be a no-op now so this should be a net-next
cleanup patch.
>
>> diff --git a/net/ipv6/route.c b/net/ipv6/route.c
>> index 42d60c76d30a..2107b13cc9ab 100644
>> --- a/net/ipv6/route.c
>> +++ b/net/ipv6/route.c
>> @@ -3635,7 +3635,9 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
>> in6_dev_put(idev);
>>
>> if (err) {
>> - lwtstate_put(fib6_nh->fib_nh_lws);
>> + /* check if we failed after fib_nh_common_init() was called */
>> + if (fib6_nh->nh_common.nhc_pcpu_rth_output)
>> + fib_nh_common_release(&fib6_nh->nh_common);
>> fib6_nh->fib_nh_lws = NULL;
>> dev_put(dev);
>> }
>
> Likewise
this is a leak in the current code and should go through -net as a
separate patch.
>
>> @@ -3822,7 +3824,7 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
>> } else {
>> err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
>> if (err)
>> - goto out;
>> + goto out_free;
>>
>> fib6_nh = rt->fib6_nh;
>>
>> @@ -3841,7 +3843,7 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
>> if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
>> NL_SET_ERR_MSG(extack, "Invalid source address");
>> err = -EINVAL;
>> - goto out;
>> + goto out_free;
>> }
>> rt->fib6_prefsrc.addr = cfg->fc_prefsrc;
>> rt->fib6_prefsrc.plen = 128;
>> @@ -3849,12 +3851,13 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
>> rt->fib6_prefsrc.plen = 0;
>>
>> return rt;
>> -out:
>> - fib6_info_release(rt);
>> - return ERR_PTR(err);
>> +
>> out_free:
>> ip_fib_metrics_put(rt->fib6_metrics);
>> + if (rt->nh)
>> + nexthop_put(rt->nh);
>
> Shouldn't this be above ip_fib_metrics_put() given nexthop_get() is
> called after ip_fib_metrics_init() ?
>
> Also, shouldn't we call fib6_nh_release() if fib6_nh_init() succeeded
> and we failed later?
similarly I think this cleanup is a separate patch.
>
>> kfree(rt);
>> +out:
>> return ERR_PTR(err);
>> }
>>
>> --
>> 2.31.1
>>
next prev parent reply other threads:[~2021-11-30 16:01 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-29 14:11 [RFC PATCH net] net: ipv6: make fib6_nh_init properly clean after itself on error Nikolay Aleksandrov
2021-11-29 21:23 ` kernel test robot
2021-11-29 21:23 ` kernel test robot
2021-11-30 12:40 ` Ido Schimmel
2021-11-30 12:48 ` Nikolay Aleksandrov
2021-11-30 16:01 ` David Ahern [this message]
2021-11-30 16:45 ` Nikolay Aleksandrov
2021-11-30 17:18 ` David Ahern
2021-11-30 21:30 ` Nikolay Aleksandrov
-- strict thread matches above, loose matches on Subject: below --
2021-11-30 1:18 kernel test robot
2021-12-08 3:21 ` kernel test robot
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=0243bb47-4b5f-a1d7-ff63-adcb6504df8a@gmail.com \
--to=dsahern@gmail.com \
--cc=davem@davemloft.net \
--cc=idosch@idosch.org \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nikolay@nvidia.com \
--cc=razor@blackwall.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 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.