All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yuehaibing <yuehaibing@huawei.com>
To: <steffen.klassert@secunet.com>, <herbert@gondor.apana.org.au>,
	<davem@davemloft.net>, <kuba@kernel.org>
Cc: <netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<lucien.xin@gmail.com>
Subject: Re: [PATCH v2] xfrm: policy: Fix xfrm policy match
Date: Fri, 15 May 2020 16:39:57 +0800	[thread overview]
Message-ID: <0015ec4c-0e9c-a9d2-eb03-4d51c5fbbe86@huawei.com> (raw)
In-Reply-To: <20200422125346.27756-1-yuehaibing@huawei.com>


Friendly ping...

Any plan for this issue?

On 2020/4/22 20:53, YueHaibing wrote:
> While update xfrm policy as follow:
> 
> ip -6 xfrm policy update src fd00::1/128 dst fd00::2/128 dir in \
>  priority 1 mark 0 mask 0x10
> ip -6 xfrm policy update src fd00::1/128 dst fd00::2/128 dir in \
>  priority 2 mark 0 mask 0x00
> ip -6 xfrm policy update src fd00::1/128 dst fd00::2/128 dir in \
>  priority 2 mark 0 mask 0x10
> 
> We get this warning:
> 
> WARNING: CPU: 0 PID: 4808 at net/xfrm/xfrm_policy.c:1548
> Kernel panic - not syncing: panic_on_warn set ...
> CPU: 0 PID: 4808 Comm: ip Not tainted 5.7.0-rc1+ #151
> Call Trace:
> RIP: 0010:xfrm_policy_insert_list+0x153/0x1e0
>  xfrm_policy_inexact_insert+0x70/0x330
>  xfrm_policy_insert+0x1df/0x250
>  xfrm_add_policy+0xcc/0x190 [xfrm_user]
>  xfrm_user_rcv_msg+0x1d1/0x1f0 [xfrm_user]
>  netlink_rcv_skb+0x4c/0x120
>  xfrm_netlink_rcv+0x32/0x40 [xfrm_user]
>  netlink_unicast+0x1b3/0x270
>  netlink_sendmsg+0x350/0x470
>  sock_sendmsg+0x4f/0x60
> 
> Policy C and policy A has the same mark.v and mark.m, so policy A is
> matched in first round lookup while updating C. However policy C and
> policy B has same mark and priority, which also leads to matched. So
> the WARN_ON is triggered.
> 
> xfrm policy lookup should only be matched if the found policy has the
> same lookup keys (mark.v & mark.m) and priority.
> 
> Fixes: 7cb8a93968e3 ("xfrm: Allow inserting policies with matching mark and different priorities")
> Signed-off-by: YueHaibing <yuehaibing@huawei.com>
> ---
> v2: policy matched while have same mark and priority
> ---
>  net/xfrm/xfrm_policy.c | 15 +++++----------
>  1 file changed, 5 insertions(+), 10 deletions(-)
> 
> diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
> index 297b2fdb3c29..2a0d7f5e6545 100644
> --- a/net/xfrm/xfrm_policy.c
> +++ b/net/xfrm/xfrm_policy.c
> @@ -1436,12 +1436,7 @@ static void xfrm_policy_requeue(struct xfrm_policy *old,
>  static bool xfrm_policy_mark_match(struct xfrm_policy *policy,
>  				   struct xfrm_policy *pol)
>  {
> -	u32 mark = policy->mark.v & policy->mark.m;
> -
> -	if (policy->mark.v == pol->mark.v && policy->mark.m == pol->mark.m)
> -		return true;
> -
> -	if ((mark & pol->mark.m) == pol->mark.v &&
> +	if ((policy->mark.v & policy->mark.m) == (pol->mark.v & pol->mark.m) &&
>  	    policy->priority == pol->priority)
>  		return true;
>  
> @@ -1628,7 +1623,7 @@ __xfrm_policy_bysel_ctx(struct hlist_head *chain, u32 mark, u32 if_id,
>  	hlist_for_each_entry(pol, chain, bydst) {
>  		if (pol->type == type &&
>  		    pol->if_id == if_id &&
> -		    (mark & pol->mark.m) == pol->mark.v &&
> +		    mark == (pol->mark.m & pol->mark.v) &&
>  		    !selector_cmp(sel, &pol->selector) &&
>  		    xfrm_sec_ctx_match(ctx, pol->security))
>  			return pol;
> @@ -1726,7 +1721,7 @@ struct xfrm_policy *xfrm_policy_byid(struct net *net, u32 mark, u32 if_id,
>  	hlist_for_each_entry(pol, chain, byidx) {
>  		if (pol->type == type && pol->index == id &&
>  		    pol->if_id == if_id &&
> -		    (mark & pol->mark.m) == pol->mark.v) {
> +		    mark == (pol->mark.m & pol->mark.v)) {
>  			xfrm_pol_hold(pol);
>  			if (delete) {
>  				*err = security_xfrm_policy_delete(
> @@ -1898,7 +1893,7 @@ static int xfrm_policy_match(const struct xfrm_policy *pol,
>  
>  	if (pol->family != family ||
>  	    pol->if_id != if_id ||
> -	    (fl->flowi_mark & pol->mark.m) != pol->mark.v ||
> +	    fl->flowi_mark != (pol->mark.m & pol->mark.v) ||
>  	    pol->type != type)
>  		return ret;
>  
> @@ -2177,7 +2172,7 @@ static struct xfrm_policy *xfrm_sk_policy_lookup(const struct sock *sk, int dir,
>  
>  		match = xfrm_selector_match(&pol->selector, fl, family);
>  		if (match) {
> -			if ((sk->sk_mark & pol->mark.m) != pol->mark.v ||
> +			if (sk->sk_mark != (pol->mark.m & pol->mark.v) ||
>  			    pol->if_id != if_id) {
>  				pol = NULL;
>  				goto out;
> 


  reply	other threads:[~2020-05-15  8:40 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-21 14:31 [PATCH] xfrm: policy: Only use mark as policy lookup key YueHaibing
2020-04-22  9:33 ` Steffen Klassert
2020-04-22 12:18   ` Yuehaibing
2020-04-22 15:41     ` Xin Long
2020-04-22 15:54       ` Xin Long
2020-04-23  2:25       ` Yuehaibing
2020-04-23  6:37         ` Xin Long
2020-04-23  8:40           ` Yuehaibing
2020-04-23  9:43             ` Xin Long
2020-04-24  3:48               ` Yuehaibing
2020-04-30  6:30                 ` Yuehaibing
2020-04-22 12:53 ` [PATCH v2] xfrm: policy: Fix xfrm policy match YueHaibing
2020-05-15  8:39   ` Yuehaibing [this message]
2020-05-19  8:53     ` Steffen Klassert
2020-05-21  6:49       ` Xin Long
2020-05-22  1:45         ` Yuehaibing
2020-05-22  5:49           ` Xin Long
2020-05-22 12:39             ` Yuehaibing
2020-05-23  9:02               ` Xin Long
2020-05-25  3:04                 ` Yuehaibing

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=0015ec4c-0e9c-a9d2-eb03-4d51c5fbbe86@huawei.com \
    --to=yuehaibing@huawei.com \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lucien.xin@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=steffen.klassert@secunet.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.