From: Ido Schimmel <idosch@idosch.org>
To: Nikolay Aleksandrov <razor@blackwall.org>
Cc: netdev@vger.kernel.org, davem@davemloft.net, kuba@kernel.org,
dsahern@gmail.com, 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 14:40:26 +0200 [thread overview]
Message-ID: <YaYbusXHbVQUXpmB@shredder> (raw)
In-Reply-To: <20211129141151.490533-1-razor@blackwall.org>
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
> 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
> @@ -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?
> kfree(rt);
> +out:
> return ERR_PTR(err);
> }
>
> --
> 2.31.1
>
next prev parent reply other threads:[~2021-11-30 12:41 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 [this message]
2021-11-30 12:48 ` Nikolay Aleksandrov
2021-11-30 16:01 ` David Ahern
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=YaYbusXHbVQUXpmB@shredder \
--to=idosch@idosch.org \
--cc=davem@davemloft.net \
--cc=dsahern@gmail.com \
--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.