On 6/14/19 9:27 PM, Stefano Brivio wrote: >>>> 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. > > Indeed. And now I'm recycling it, even if strict checking is not > requested. > >>> 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. > > So you're implying that: > > - we shouldn't support NLM_F_MATCH > > - we should keep this broken for iproute2 < 5.0.0? > > I guess this might be acceptable, but please state it clearly. > > By the way, if really needed, we can do strict checking even if not > requested. But this might add more and more userspace breakage, I guess. >
Prior to 5.0 and strict checking, iproute2 was sending ifinfomsg as the header struct - which is wrong for routes. ifi_flags just happens to have the same offset as rtm_flags so the check for RTM_F_CLONED is ok, but nothing else sent in the get request (e.g., potentially appended attributes) can be trusted, so the !strict path you are adding with nlmsg_parse_deprecated is wrong. The kernel side filter argument can be used and treating RTM_F_CLONED as a filter is ok, but not the new parsing code.