On 05/13, Willem de Bruijn wrote: > On Mon, May 13, 2019 at 3:53 PM Stanislav Fomichev <sdf@xxxxxxxxxx> wrote: > > > > If we have a flow dissector BPF program attached to the namespace, > > FLOW_DISSECTOR_KEY_ETH_ADDRS won't trigger because we exit early. > > I suppose that this is true for a variety of keys? For instance, also > FLOW_DISSECTOR_KEY_IPV4_ADDRS. I though the intent was to support most of the basic stuff (eth/ip/tcp/udp) without any esoteric protocols. Not sure about FLOW_DISSECTOR_KEY_IPV4_ADDRS, looks like we support that (except FLOW_DISSECTOR_KEY_TIPC part). > We originally intended BPF flow dissection for all paths except > tc_flower. As that catches all the vulnerable cases on the ingress > path on the one hand and it is infeasible to support all the > flower features, now and future. I think that is the real fix. Sorry, didn't get what you meant by the real fix. Don't care about tc_flower? Just support a minimal set of features needed by selftests? > > > > Handle FLOW_DISSECTOR_KEY_ETH_ADDRS before BPF and only if we have > > an skb (used by tc-flower only). > > > > Fixes: d58e468b1112 ("flow_dissector: implements flow dissector BPF hook") > > Signed-off-by: Stanislav Fomichev <sdf@xxxxxxxxxx> > > --- > > net/core/flow_dissector.c | 23 ++++++++++++----------- > > 1 file changed, 12 insertions(+), 11 deletions(-) > > > > diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c > > index 9ca784c592ac..ba76d9168c8b 100644 > > --- a/net/core/flow_dissector.c > > +++ b/net/core/flow_dissector.c > > @@ -825,6 +825,18 @@ bool __skb_flow_dissect(const struct net *net, > > else if (skb->sk) > > net = sock_net(skb->sk); > > } > > + > > + if (dissector_uses_key(flow_dissector, > > + FLOW_DISSECTOR_KEY_ETH_ADDRS)) { > > + struct ethhdr *eth = eth_hdr(skb); > > Here as well as in the original patch: is it safe to just cast to > eth_hdr? In the same file, __skb_flow_dissect_gre does test for > (encapsulated) protocol first. Good question, I guess the assumption here is that FLOW_DISSECTOR_KEY_ETH_ADDRS is only used by tc_flower and the appropriate checks should be there as well. It's probably better to check skb->proto here though.