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. 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. > > 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.