On Fri, 17 May 2019 10:59:13 -0700 David Ahern <dsah...@kernel.org> wrote:
> From: David Ahern <dsah...@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 <ja...@zx2c4.com> > Signed-off-by: David Ahern <dsah...@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.