diff mbox series

[iproute2] ip route: Set rtm_dst_len to 32 for all ip route get requests

Message ID 20190517175913.20629-1-dsahern@kernel.org
State Changes Requested
Delegated to: stephen hemminger
Headers show
Series [iproute2] ip route: Set rtm_dst_len to 32 for all ip route get requests | expand

Commit Message

David Ahern May 17, 2019, 5:59 p.m. UTC
From: David Ahern <dsahern@gmail.com>

Jason reported that ip route get with a prefix length is now
failing:
    $ 192.168.50.0/24
    RTNETLINK answers: Invalid argument

iproute2 now uses strict mode and strict mode in the kernel
requires rtm_dst_len to be 32. Non-strict mode ignores the
prefix length, so this allows ip to work without affecting
existing users who add a prefix length to the request.

Fixes: aea41afcfd6d6 ("ip bridge: Set NETLINK_GET_STRICT_CHK on socket")
Reported-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
---
 ip/iproute.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Stephen Hemminger May 17, 2019, 6:06 p.m. UTC | #1
On Fri, 17 May 2019 10:59:13 -0700
David Ahern <dsahern@kernel.org> wrote:

> From: David Ahern <dsahern@gmail.com>
> 
> Jason reported that ip route get with a prefix length is now
> failing:
>     $ 192.168.50.0/24
>     RTNETLINK answers: Invalid argument
> 
> iproute2 now uses strict mode and strict mode in the kernel
> requires rtm_dst_len to be 32. Non-strict mode ignores the
> prefix length, so this allows ip to work without affecting
> existing users who add a prefix length to the request.
> 
> Fixes: aea41afcfd6d6 ("ip bridge: Set NETLINK_GET_STRICT_CHK on socket")
> Reported-by: Jason A. Donenfeld <Jason@zx2c4.com>
> Signed-off-by: David Ahern <dsahern@gmail.com>
> ---
>  ip/iproute.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/ip/iproute.c b/ip/iproute.c
> index 2b3dcc5dbd53..d980b86ffd42 100644
> --- a/ip/iproute.c
> +++ b/ip/iproute.c
> @@ -2035,7 +2035,11 @@ static int iproute_get(int argc, char **argv)
>  			if (addr.bytelen)
>  				addattr_l(&req.n, sizeof(req),
>  					  RTA_DST, &addr.data, addr.bytelen);
> -			req.r.rtm_dst_len = addr.bitlen;
> +			/* kernel ignores prefix length on 'route get'
> +			 * requests; to allow ip to work with strict mode
> +			 * but not break existing users, just set to 32
> +			 */
> +			req.r.rtm_dst_len = 32;
>  			address_found = true;
>  		}
>  		argc--; argv++;

I don't like silently ignoring things. It was wrong before and it
is trapped now.

Probably better to error out in iproute2 if any prefix is given.
Stephen Hemminger May 22, 2019, 11:16 p.m. UTC | #2
On Fri, 17 May 2019 10:59:13 -0700
David Ahern <dsahern@kernel.org> wrote:

> index 2b3dcc5dbd53..d980b86ffd42 100644
> --- a/ip/iproute.c
> +++ b/ip/iproute.c
> @@ -2035,7 +2035,11 @@ static int iproute_get(int argc, char **argv)
>  			if (addr.bytelen)
>  				addattr_l(&req.n, sizeof(req),
>  					  RTA_DST, &addr.data, addr.bytelen);
> -			req.r.rtm_dst_len = addr.bitlen;
> +			/* kernel ignores prefix length on 'route get'
> +			 * requests; to allow ip to work with strict mode
> +			 * but not break existing users, just set to 32
> +			 */
> +			req.r.rtm_dst_len = 32;
>  			address_found = true;
>  		}
>  		argc--; argv++;

Why not warn user that any prefix length (ie not 32) is ignored,
then do what you propose.
David Ahern May 23, 2019, 3:42 a.m. UTC | #3
On 5/22/19 5:16 PM, Stephen Hemminger wrote:
> On Fri, 17 May 2019 10:59:13 -0700
> David Ahern <dsahern@kernel.org> wrote:
> 
>> index 2b3dcc5dbd53..d980b86ffd42 100644
>> --- a/ip/iproute.c
>> +++ b/ip/iproute.c
>> @@ -2035,7 +2035,11 @@ static int iproute_get(int argc, char **argv)
>>  			if (addr.bytelen)
>>  				addattr_l(&req.n, sizeof(req),
>>  					  RTA_DST, &addr.data, addr.bytelen);
>> -			req.r.rtm_dst_len = addr.bitlen;
>> +			/* kernel ignores prefix length on 'route get'
>> +			 * requests; to allow ip to work with strict mode
>> +			 * but not break existing users, just set to 32
>> +			 */
>> +			req.r.rtm_dst_len = 32;
>>  			address_found = true;
>>  		}
>>  		argc--; argv++;
> 
> Why not warn user that any prefix length (ie not 32) is ignored,
> then do what you propose.
> 

My first version did that. I thought people would complain about a
stderr message. At least with failing the 'route get' scripts can be fixed.

After more thought even changing the prefix length for users presents a
limitation on future changes.
diff mbox series

Patch

diff --git a/ip/iproute.c b/ip/iproute.c
index 2b3dcc5dbd53..d980b86ffd42 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -2035,7 +2035,11 @@  static int iproute_get(int argc, char **argv)
 			if (addr.bytelen)
 				addattr_l(&req.n, sizeof(req),
 					  RTA_DST, &addr.data, addr.bytelen);
-			req.r.rtm_dst_len = addr.bitlen;
+			/* kernel ignores prefix length on 'route get'
+			 * requests; to allow ip to work with strict mode
+			 * but not break existing users, just set to 32
+			 */
+			req.r.rtm_dst_len = 32;
 			address_found = true;
 		}
 		argc--; argv++;