On 6/14/19 9:13 PM, Stefano Brivio wrote: > On Fri, 14 Jun 2019 20:54:49 -0600 > David Ahern <dsah...@gmail.com> wrote: > >> On 6/14/19 7:32 PM, Stefano Brivio wrote: >>> ip_valid_fib_dump_req() does two things: performs strict checking on >>> netlink attributes for dump requests, and sets a dump filter if netlink >>> attributes require it. >>> >>> We might want to just set a filter, without performing strict validation. >>> >>> Rename it to ip_filter_fib_dump_req(), and add a 'strict' boolean >>> argument that must be set if strict validation is requested. >>> >>> This patch doesn't introduce any functional changes. >>> >>> Signed-off-by: Stefano Brivio <sbri...@redhat.com> >>> --- >>> v4: New patch >>> >> >> Can you explain why this patch is needed? The existing function requires >> strict mode and is needed to enable any of the kernel side filtering >> beyond the RTM_F_CLONED setting in rtm_flags. > > It's mostly to have proper NLM_F_MATCH support. Let's pick an iproute2 > version without strict checking support (< 5.0), that sets NLM_F_MATCH > though. Then we need this check: > > if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*rtm)))
but that check existed long before any of the strict checking and kernel side filtering was added. > > and to set filter parameters not just based on flags (i.e. RTM_F_CLONED), > but also on table, protocol, etc. and to do that you *must* have strict checking. There is no way to trust userspace without that strict flag set because iproute2 for the longest time sent the wrong header for almost all dump requests. > > For example one might want to: 'ip route list cache table main', and this > is then taken into account in fn_trie_dump_leaf() and rt6_dump_route(). > > Reusing this function avoids a nice amount of duplicated code and allows > to have an almost common path with strict checking. >