| 
     
      
      
      From: Jon M. <jm...@re...> - 2021-03-31 14:53:42
      
     
   | 
On 3/29/21 10:16 PM, Hoang Le wrote:
> When enabling a bearer
s/with identify//g
> by name, we don't sanity check
> its name with higher slot in bearer list. This lead to duplicate
> bearer names bypassed the check.
This may have the effect that the name of an already enabled bearer 
bypasses the check.
>
> To fix the above issue, we just perform an extra checking with all
> existing bearers.
>
> Fixes: cb30a63384bc9 ("tipc: refactor function tipc_enable_bearer()")
> Signed-off-by: Hoang Le <hoa...@de...>
> ---
>   net/tipc/bearer.c | 45 ++++++++++++++++++++++++++-------------------
>   1 file changed, 26 insertions(+), 19 deletions(-)
>
> diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
> index d47e0b940ac9..94eddc67d52e 100644
> --- a/net/tipc/bearer.c
> +++ b/net/tipc/bearer.c
> @@ -256,6 +256,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
>   	int bearer_id = 0;
>   	int res = -EINVAL;
>   	char *errstr = "";
> +	u32 i;
>   
>   	if (!bearer_name_validate(name, &b_names)) {
>   		errstr = "illegal name";
> @@ -280,31 +281,37 @@ static int tipc_enable_bearer(struct net *net, const char *name,
>   		prio = m->priority;
>   
>   	/* Check new bearer vs existing ones and find free bearer id if any */
> -	while (bearer_id < MAX_BEARERS) {
> -		b = rtnl_dereference(tn->bearer_list[bearer_id]);
> -		if (!b)
> -			break;
> +	bearer_id = MAX_BEARERS;
> +	i = MAX_BEARERS;
> +	while (i-- != 0) {
> +		b = rtnl_dereference(tn->bearer_list[i]);
> +		if (!b) {
> +			bearer_id = i;
> +			continue;
> +		}
>   		if (!strcmp(name, b->name)) {
>   			errstr = "already enabled";
>   			NL_SET_ERR_MSG(extack, "Already enabled");
>   			goto rejected;
>   		}
> -		bearer_id++;
> -		if (b->priority != prio)
> -			continue;
> -		if (++with_this_prio <= 2)
> -			continue;
> -		pr_warn("Bearer <%s>: already 2 bearers with priority %u\n",
> -			name, prio);
> -		if (prio == TIPC_MIN_LINK_PRI) {
> -			errstr = "cannot adjust to lower";
> -			NL_SET_ERR_MSG(extack, "Cannot adjust to lower");
> -			goto rejected;
> +
> +		if (b->priority == prio &&
> +		    (++with_this_prio > 2)) {
> +			pr_warn("Bearer <%s>: already 2 bearers with priority %u\n",
> +				name, prio);
> +
> +			if (prio == TIPC_MIN_LINK_PRI) {
> +				errstr = "cannot adjust to lower";
> +				NL_SET_ERR_MSG(extack, "Cannot adjust to lower");
> +				goto rejected;
> +			}
> +
> +			pr_warn("Bearer <%s>: trying with adjusted priority\n", name);
> +			prio--;
> +			bearer_id = MAX_BEARERS;
> +			i = MAX_BEARERS;
> +			with_this_prio = 1;
>   		}
> -		pr_warn("Bearer <%s>: trying with adjusted priority\n", name);
> -		prio--;
> -		bearer_id = 0;
> -		with_this_prio = 1;
>   	}
>   
>   	if (bearer_id >= MAX_BEARERS) {
Acked-by: Jon Maloy <jm...@re...>
 |